From a8473d36d793b7981bab2769817c28a7e1b8a9f3 Mon Sep 17 00:00:00 2001 From: jeanmon Date: Wed, 20 Dec 2023 12:11:13 +0000 Subject: [PATCH] Support for large unsigned integer constants up to 256 bits --- bberg/src/relation_builder.rs | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/bberg/src/relation_builder.rs b/bberg/src/relation_builder.rs index 973be278c..5c657c95f 100644 --- a/bberg/src/relation_builder.rs +++ b/bberg/src/relation_builder.rs @@ -6,6 +6,7 @@ use ast::analyzed::{ }; use ast::parsed::SelectedExpressions; use itertools::Itertools; +use num_bigint::BigUint; use std::collections::HashMap; use std::collections::HashSet; @@ -328,7 +329,27 @@ fn craft_expression( collected_public_identities: &mut HashSet, ) -> BBIdentity { match expr { - Expression::Number(n) => (1, format!("FF({})", n.to_arbitrary_integer())), + Expression::Number(n) => { + let number: BigUint = n.to_arbitrary_integer(); + if number.bits() < 32 { + return (1, format!("FF({})", number)); + } + if number.bits() < 64 { + return (1, format!("FF({}UL)", number)); + } + if number.bits() < 256 { + let mut chunks: Vec = number.iter_u64_digits().collect::>(); + chunks.resize(4, 0); + return ( + 1, + format!( + "FF(uint256_t{{{}, {}, {}, {}}})", + chunks[0], chunks[1], chunks[2], chunks[3], + ), + ); + } + unimplemented!("{:?}", expr); + } Expression::Reference(polyref) => { let mut poly_name = polyref.name.replace('.', "_").to_string(); if polyref.next {