Skip to content

Commit 2d432ba

Browse files
committed
added split and safe_convert functions
1 parent 730f6f6 commit 2d432ba

3 files changed

Lines changed: 166 additions & 28 deletions

File tree

simf/lib/u8/convert.simf

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
use crate::lib::asserts::assert_eq_8;
2+
13
/// Widening uint conversions
24

35
/// Converts u8 to u16
4-
pub fn u8_to_u16(a: u8) -> u16 {
6+
pub fn u8_to_u16(
7+
a: u8
8+
) -> u16 {
59
<(u8, u8)>::into((0, a))
610
}
711

@@ -61,3 +65,28 @@ pub fn u8_to_u256(a: u8) -> u256 {
6165
)
6266
)
6367
}
68+
69+
/// Splitting uint conversions
70+
71+
/// Splits u8 into eight u1
72+
pub fn split_u8_to_u1(
73+
a: u8
74+
) -> (u1, u1, u1, u1, u1, u1, u1, u1) {
75+
<u8>::into(a)
76+
}
77+
78+
/// Narrowing uint conversions
79+
80+
/// Converts u8 into u1.
81+
/// Panics if the value does not fit in u1
82+
pub fn safe_u8_to_u1(
83+
a: u8
84+
) -> u1 {
85+
let (_, _, _, _, _, _, _, a_u1): (u1, u1, u1, u1, u1, u1, u1, u1) = split_u8_to_u1(a);
86+
87+
let a_recovered: u8 = <(u1, u1, u1, u1, u1, u1, u1, u1)>::into((0, 0, 0, 0, 0, 0, 0, a_u1));
88+
89+
assert_eq_8(a, a_recovered);
90+
91+
a_u1
92+
}

simf/u8_convert_test.simf

Lines changed: 70 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@ use crate::lib::u8::convert::{
33
u8_to_u32,
44
u8_to_u64,
55
u8_to_u128,
6-
u8_to_u256
6+
u8_to_u256,
7+
split_u8_to_u1,
8+
safe_u8_to_u1
79
};
8-
// use crate::lib::u256::{split_256_into_64, eq_256}; TODO: uncomment when u256 functions are merged
10+
// use crate::lib::u256::{split_256_into_64}; TODO: uncomment when u256 functions are merged
911
use crate::lib::u128::eq_128;
12+
use crate::lib::asserts::assert_eq_1;
1013
use crate::helper::if_test_this_function;
1114

1215
fn main() {
@@ -54,12 +57,70 @@ fn main() {
5457
}
5558
};
5659

57-
// TODO: uncomment when u256 functions are merged
60+
match if_test_this_function(4, fn_idx) {
61+
false => {},
62+
true => {
63+
assert!(jet::eq_256(u8_to_u256(a), expected));
64+
}
65+
};
66+
67+
match if_test_this_function(5, fn_idx) {
68+
false => {},
69+
true => {
70+
let (
71+
a7,
72+
a6,
73+
a5,
74+
a4,
75+
a3,
76+
a2,
77+
a1,
78+
a0
79+
): (u1, u1, u1, u1, u1, u1, u1, u1) = split_u8_to_u1(a);
80+
81+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
82+
let (_, _, _, expected): (u16, u16, u16, u16) = <u64>::into(expected);
83+
let (_, expected): (u8, u8) = <u16>::into(expected);
84+
let (
85+
expected7,
86+
expected6,
87+
expected5,
88+
expected4,
89+
expected3,
90+
expected2,
91+
expected1,
92+
expected0
93+
): (u1, u1, u1, u1, u1, u1, u1, u1) = <u8>::into(a);
5894

59-
// match if_test_this_function(4, fn_idx) {
60-
// false => {},
61-
// true => {
62-
// assert!(eq_256(u8_to_u256(a), expected));
63-
// }
64-
// };
95+
assert_eq_1(a7, expected7);
96+
assert_eq_1(a6, expected6);
97+
assert_eq_1(a5, expected5);
98+
assert_eq_1(a4, expected4);
99+
assert_eq_1(a3, expected3);
100+
assert_eq_1(a2, expected2);
101+
assert_eq_1(a1, expected1);
102+
assert_eq_1(a0, expected0);
103+
}
104+
};
105+
106+
match if_test_this_function(6, fn_idx) {
107+
false => {},
108+
true => {
109+
let (_, _, _, expected): (u64, u64, u64, u64) = <u256>::into(expected);
110+
let (_, _, _, expected): (u16, u16, u16, u16) = <u64>::into(expected);
111+
let (_, expected): (u8, u8) = <u16>::into(expected);
112+
let (
113+
_,
114+
_,
115+
_,
116+
_,
117+
_,
118+
_,
119+
_,
120+
expected
121+
): (u1, u1, u1, u1, u1, u1, u1, u1) = <u8>::into(expected);
122+
123+
assert_eq_1(safe_u8_to_u1(a), expected);
124+
}
125+
};
65126
}

tests/u8_convert_test.rs

Lines changed: 66 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@ enum FunctionToTest {
1515
U8ToU32,
1616
U8ToU64,
1717
U8ToU128,
18-
// U8ToU256, TODO: uncomment when u256 functions are merged
18+
U8ToU256,
19+
SplitU8ToU1,
20+
SafeU8ToU1,
1921
}
2022

2123
#[inline]
@@ -102,21 +104,67 @@ mod u8_convert_test {
102104
)
103105
}
104106

105-
// TODO: uncomment when u256 functions are merged
106-
107-
// #[simplex::test]
108-
// fn u8_convert_test_u8_to_u256(context: simplex::TestContext) -> anyhow::Result<()> {
109-
// let a = rand::thread_rng().gen_range(0..=u8::MAX);
110-
111-
// run(
112-
// &context,
113-
// program(),
114-
// build_witness(
115-
// op(FunctionToTest::U8ToU256),
116-
// a,
117-
// U256::from(a).to_big_endian(),
118-
// ),
119-
// Expect::Ok,
120-
// )
121-
// }
107+
#[simplex::test]
108+
fn u8_convert_test_u8_to_u256(context: simplex::TestContext) -> anyhow::Result<()> {
109+
let a = rand::thread_rng().gen_range(0..=u8::MAX);
110+
111+
run(
112+
&context,
113+
program(),
114+
build_witness(
115+
op(FunctionToTest::U8ToU256),
116+
a,
117+
U256::from(a).to_big_endian(),
118+
),
119+
Expect::Ok,
120+
)
121+
}
122+
123+
#[simplex::test]
124+
fn u8_convert_test_split_u8_to_u1(context: simplex::TestContext) -> anyhow::Result<()> {
125+
let a = rand::thread_rng().gen_range(0..=u8::MAX);
126+
127+
run(
128+
&context,
129+
program(),
130+
build_witness(
131+
op(FunctionToTest::SplitU8ToU1),
132+
a,
133+
U256::from(a).to_big_endian(),
134+
),
135+
Expect::Ok,
136+
)
137+
}
138+
139+
#[simplex::test]
140+
fn u8_convert_test_safe_u8_to_u1(context: simplex::TestContext) -> anyhow::Result<()> {
141+
let a = rand::thread_rng().gen_range(0..=1);
142+
143+
run(
144+
&context,
145+
program(),
146+
build_witness(
147+
op(FunctionToTest::SafeU8ToU1),
148+
a,
149+
U256::from(a).to_big_endian(),
150+
),
151+
Expect::Ok,
152+
)
153+
}
154+
155+
#[simplex::test]
156+
fn u8_convert_test_safe_u8_to_u1_overflow(context: simplex::TestContext) -> anyhow::Result<()> {
157+
let a = rand::thread_rng().gen_range(2..=u8::MAX);
158+
159+
run(
160+
&context,
161+
program(),
162+
build_witness(
163+
op(FunctionToTest::SafeU8ToU1),
164+
a,
165+
U256::from(a).to_big_endian(),
166+
),
167+
Expect::AssertFailed,
168+
)
169+
}
122170
}

0 commit comments

Comments
 (0)