1use halo2_base::{safe_types::VarLenBytesVec, utils::ScalarField, AssignedValue, Context};
2
3#[derive(Clone, Copy, Debug)]
4pub struct RlcTrace<F: ScalarField> {
6 pub rlc_val: AssignedValue<F>, pub len: AssignedValue<F>, pub max_len: usize,
9 }
12
13impl<F: ScalarField> RlcTrace<F> {
14 pub fn new(rlc_val: AssignedValue<F>, len: AssignedValue<F>, max_len: usize) -> Self {
15 Self { rlc_val, len, max_len }
16 }
17
18 pub fn from_fixed(ctx: &mut Context<F>, trace: RlcFixedTrace<F>) -> Self {
19 let len = ctx.load_constant(F::from(trace.len as u64));
20 Self { rlc_val: trace.rlc_val, len, max_len: trace.len }
21 }
22}
23
24#[derive(Clone, Copy, Debug)]
25pub struct RlcFixedTrace<F: ScalarField> {
27 pub rlc_val: AssignedValue<F>, pub len: usize,
30}
31
32#[derive(Clone, Copy, Debug)]
35pub struct RlcVar<F: ScalarField> {
36 pub rlc_val: AssignedValue<F>,
37 pub len: AssignedValue<F>,
38}
39
40impl<F: ScalarField> From<RlcTrace<F>> for RlcVar<F> {
41 fn from(trace: RlcTrace<F>) -> Self {
42 RlcVar { rlc_val: trace.rlc_val, len: trace.len }
43 }
44}
45
46#[derive(Clone, Copy, Debug)]
47pub struct RlcVarPtr<'a, F: ScalarField> {
48 pub rlc_val: &'a AssignedValue<F>,
49 pub len: &'a AssignedValue<F>,
50}
51
52impl<'a, F: ScalarField> From<&'a RlcTrace<F>> for RlcVarPtr<'a, F> {
53 fn from(trace: &'a RlcTrace<F>) -> Self {
54 RlcVarPtr { rlc_val: &trace.rlc_val, len: &trace.len }
55 }
56}
57
58impl<'a, F: ScalarField> From<&'a RlcVar<F>> for RlcVarPtr<'a, F> {
59 fn from(trace: &'a RlcVar<F>) -> RlcVarPtr<'a, F> {
60 RlcVarPtr { rlc_val: &trace.rlc_val, len: &trace.len }
61 }
62}
63
64#[derive(Clone, Debug)]
69pub struct AssignedVarLenVec<F: ScalarField> {
70 pub values: Vec<AssignedValue<F>>,
71 pub len: AssignedValue<F>,
72}
73
74impl<F: ScalarField> AssignedVarLenVec<F> {
75 pub fn max_len(&self) -> usize {
76 self.values.len()
77 }
78}
79
80impl<F: ScalarField> From<VarLenBytesVec<F>> for AssignedVarLenVec<F> {
81 fn from(array: VarLenBytesVec<F>) -> Self {
82 let values = array.bytes().iter().map(|b| *b.as_ref()).collect();
83 let len = *array.len();
84 Self { values, len }
85 }
86}
87
88#[derive(Clone, Debug)]
89pub struct ConcatVarFixedArrayWitness<F: ScalarField> {
90 pub prefix: AssignedVarLenVec<F>,
91 pub suffix: Vec<AssignedValue<F>>,
92 pub concat: AssignedVarLenVec<F>,
93}
94
95#[derive(Debug, Clone)]
98pub struct ConcatVarFixedArrayTrace<F: ScalarField> {
99 pub prefix_rlc: RlcTrace<F>,
100 pub suffix_rlc: RlcFixedTrace<F>,
101 pub concat_rlc: RlcTrace<F>,
102}