From 31e94b187b10afddc84c7470ad013b162943134f Mon Sep 17 00:00:00 2001 From: Lorenzo Rota Date: Wed, 5 Feb 2025 18:11:00 +0100 Subject: [PATCH 1/4] Added precomputations for Ty::Struct in declare_input --- examples/ZoKrates/pf/arr_str_arr_str2.zok | 10 +++ examples/ZoKrates/pf/arr_str_arr_str2.zok.pin | 12 +++ examples/ZoKrates/pf/arr_str_arr_str2.zok.vin | 8 ++ src/front/zsharp/term.rs | 80 +++++++++++++++---- 4 files changed, 93 insertions(+), 17 deletions(-) create mode 100644 examples/ZoKrates/pf/arr_str_arr_str2.zok create mode 100644 examples/ZoKrates/pf/arr_str_arr_str2.zok.pin create mode 100644 examples/ZoKrates/pf/arr_str_arr_str2.zok.vin diff --git a/examples/ZoKrates/pf/arr_str_arr_str2.zok b/examples/ZoKrates/pf/arr_str_arr_str2.zok new file mode 100644 index 000000000..f6866d14f --- /dev/null +++ b/examples/ZoKrates/pf/arr_str_arr_str2.zok @@ -0,0 +1,10 @@ +struct Pt { + field x + field y +} +struct Pts { + Pt[2] pts +} + +def main(private Pts[1] pts) -> Pt: + return Pt {x: pts[0].pts[0].x * pts[0].pts[1].x, y: pts[0].pts[0].y * pts[0].pts[1].y} diff --git a/examples/ZoKrates/pf/arr_str_arr_str2.zok.pin b/examples/ZoKrates/pf/arr_str_arr_str2.zok.pin new file mode 100644 index 000000000..2a76b6e22 --- /dev/null +++ b/examples/ZoKrates/pf/arr_str_arr_str2.zok.pin @@ -0,0 +1,12 @@ +(set_default_modulus 52435875175126190479447740508185965837690552500527637822603658699938581184513 +(let ( + (pts.0.pts.0.x #f2) + (pts.0.pts.0.y #f4) + (pts.0.pts.1.x #f2) + (pts.0.pts.1.y #f4) +) true ;ignored +) +) + + + diff --git a/examples/ZoKrates/pf/arr_str_arr_str2.zok.vin b/examples/ZoKrates/pf/arr_str_arr_str2.zok.vin new file mode 100644 index 000000000..233b7b9e2 --- /dev/null +++ b/examples/ZoKrates/pf/arr_str_arr_str2.zok.vin @@ -0,0 +1,8 @@ +(set_default_modulus 52435875175126190479447740508185965837690552500527637822603658699938581184513 +(let ( + (return.x #f4) + (return.y #f16) +) true ;ignored +) +) + diff --git a/src/front/zsharp/term.rs b/src/front/zsharp/term.rs index 2e6810fde..8ac1cd6f6 100644 --- a/src/front/zsharp/term.rs +++ b/src/front/zsharp/term.rs @@ -169,6 +169,43 @@ impl T { s => Err(format!("Not an array: {s}")), } } + fn unwrap_struct_ir(self) -> Result, String> { + match &self.ty { + Ty::Struct(_, map) => Ok(FieldList::new( + map.fields() + .map(|(field, _)| { + let (idx, _) = map + .search(field) + .expect(&format!("No field '{field}'")); + (field.clone(), term![Op::Field(idx); self.term.clone()]) + }) + .collect(), + )), + s => Err(format!("{s} is not a struct")), + } + } + pub fn unwrap_struct(self) -> Result, String> { + match &self.ty { + Ty::Struct(_, fields) => { + let fields = (*fields).clone(); + Ok(FieldList::new(self + .unwrap_struct_ir()? + .fields() + .map(|(field, t)| { + let f_ty = fields + .search(field) + .expect(&format!("No field '{field}'")) + .1 + .clone(); + + (field.clone(), T::new(f_ty, t.clone())) + }) + .collect(), + )) + } + s => Err(format!("Not a struct: {s}")), + } + } pub fn new_array(v: Vec) -> Result { array(v) } @@ -1216,23 +1253,32 @@ impl Embeddable for ZSharp { ) .unwrap() } - Ty::Struct(n, fs) => T::new_struct( - n.clone(), - fs.fields() - .map(|(f_name, f_ty)| { - ( - f_name.clone(), - self.declare_input( - ctx, - f_ty, - field_name(&name, f_name), - visibility, - precompute.as_ref().map(|_| unimplemented!("precomputations for declared inputs that are Z# structures")), - ), - ) - }) - .collect(), - ), + + Ty::Struct(n, fs) => { + let ps = match precompute.map(|p| p.unwrap_struct()) { + Some(Ok(fl)) => fl, + Some(Err(e)) => panic!("{}", e), + None => FieldList::new(vec![]), + }; + + Self::T::new_struct( + n.clone(), + fs.fields() + .map(|(f_name, f_ty)| { + ( + f_name.clone(), + self.declare_input( + ctx, + f_ty, + field_name(&name, f_name), + visibility, + ps.search(f_name).map(|(_, p)| p.clone()) + ), + ) + }) + .collect(), + ) + }, } } fn ite(&self, _ctx: &mut CirCtx, cond: Term, t: Self::T, f: Self::T) -> Self::T { From ea55e94cd63c70704ea4eb41932b82785d7ac095 Mon Sep 17 00:00:00 2001 From: Lorenzo Rota Date: Wed, 5 Feb 2025 18:44:17 +0100 Subject: [PATCH 2/4] Fix linting errors --- src/front/zsharp/term.rs | 42 ++++++++++++++++++---------------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/src/front/zsharp/term.rs b/src/front/zsharp/term.rs index 8ac1cd6f6..afabd433f 100644 --- a/src/front/zsharp/term.rs +++ b/src/front/zsharp/term.rs @@ -174,9 +174,7 @@ impl T { Ty::Struct(_, map) => Ok(FieldList::new( map.fields() .map(|(field, _)| { - let (idx, _) = map - .search(field) - .expect(&format!("No field '{field}'")); + let (idx, _) = map.search(field).expect(&format!("No field '{field}'")); (field.clone(), term![Op::Field(idx); self.term.clone()]) }) .collect(), @@ -188,19 +186,19 @@ impl T { match &self.ty { Ty::Struct(_, fields) => { let fields = (*fields).clone(); - Ok(FieldList::new(self - .unwrap_struct_ir()? - .fields() - .map(|(field, t)| { - let f_ty = fields - .search(field) - .expect(&format!("No field '{field}'")) - .1 - .clone(); - - (field.clone(), T::new(f_ty, t.clone())) - }) - .collect(), + Ok(FieldList::new( + self.unwrap_struct_ir()? + .fields() + .map(|(field, t)| { + let f_ty = fields + .search(field) + .expect(&format!("No field '{field}'")) + .1 + .clone(); + + (field.clone(), T::new(f_ty, t.clone())) + }) + .collect(), )) } s => Err(format!("Not a struct: {s}")), @@ -1246,11 +1244,9 @@ impl Embeddable for ZSharp { None => std::iter::repeat(None).take(*n).collect(), }; debug_assert_eq!(*n, ps.len()); - array( - ps.into_iter().enumerate().map(|(i, p)| { - self.declare_input(ctx, &Ty::Field, idx_name(&name, i), visibility, p) - }), - ) + array(ps.into_iter().enumerate().map(|(i, p)| { + self.declare_input(ctx, &Ty::Field, idx_name(&name, i), visibility, p) + })) .unwrap() } @@ -1272,13 +1268,13 @@ impl Embeddable for ZSharp { f_ty, field_name(&name, f_name), visibility, - ps.search(f_name).map(|(_, p)| p.clone()) + ps.search(f_name).map(|(_, p)| p.clone()), ), ) }) .collect(), ) - }, + } } } fn ite(&self, _ctx: &mut CirCtx, cond: Term, t: Self::T, f: Self::T) -> Self::T { From c7be8343def1dd85a0ee9c4e6a9d7c78bec45c6d Mon Sep 17 00:00:00 2001 From: Lorenzo Rota Date: Tue, 11 Feb 2025 11:54:15 +0100 Subject: [PATCH 3/4] Fixed linting error + Use unwrap_or_else instead of expect --- src/front/zsharp/term.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/front/zsharp/term.rs b/src/front/zsharp/term.rs index afabd433f..892bcadd0 100644 --- a/src/front/zsharp/term.rs +++ b/src/front/zsharp/term.rs @@ -174,7 +174,7 @@ impl T { Ty::Struct(_, map) => Ok(FieldList::new( map.fields() .map(|(field, _)| { - let (idx, _) = map.search(field).expect(&format!("No field '{field}'")); + let (idx, _) = map.search(field).unwrap_or_else(|| panic!("{}", "No field '{field}'")); (field.clone(), term![Op::Field(idx); self.term.clone()]) }) .collect(), @@ -192,7 +192,7 @@ impl T { .map(|(field, t)| { let f_ty = fields .search(field) - .expect(&format!("No field '{field}'")) + .unwrap_or_else(|| panic!("{}", "No field '{field}'")) .1 .clone(); From ce9a93f6f83058c173a50f68267f12d918f2f713 Mon Sep 17 00:00:00 2001 From: Lorenzo Rota Date: Tue, 11 Feb 2025 11:56:13 +0100 Subject: [PATCH 4/4] Fixed formatting --- src/front/zsharp/term.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/front/zsharp/term.rs b/src/front/zsharp/term.rs index 892bcadd0..9cbcdcc12 100644 --- a/src/front/zsharp/term.rs +++ b/src/front/zsharp/term.rs @@ -174,7 +174,9 @@ impl T { Ty::Struct(_, map) => Ok(FieldList::new( map.fields() .map(|(field, _)| { - let (idx, _) = map.search(field).unwrap_or_else(|| panic!("{}", "No field '{field}'")); + let (idx, _) = map + .search(field) + .unwrap_or_else(|| panic!("{}", "No field '{field}'")); (field.clone(), term![Op::Field(idx); self.term.clone()]) }) .collect(),