binary_number_with_real_selector.rs 介绍
主要功能:用多个列(列的值取0和1)来表示某一类型变量的值(在State Circuit
、Copy Circuit
等子电路中主要表示Tag
类型)
内容
列的定义
#[derive(Clone, Copy, Debug)]
pub struct BinaryNumberConfig<T, const N: usize> {
/// Must be constrained to be binary for correctness.
pub bits: [Column<Advice>; N],
_marker: PhantomData<T>,
}
pub struct BinaryNumberChip<F, T, const N: usize> {
config: BinaryNumberConfig<T, N>,
_marker: PhantomData<F>,
}
定义了N
个Advice
列,其中N
是表示T.into()
(T
是所表示的类型)所需的比特数
外界使用的是BinaryNumberChip
,成员变量和BinaryNumberConfig
没有什么不同,只是为了层次关系更好。
所建立的约束
BinaryNumberChip
含有以下几个约束(写于其configure()
方法):
- "bit column is 0 or 1":每一个格子的值只能为0或1
- "binary number value”:
configure()
函数包含一个参数value: Option<Column<Advice>>
(可以理解为一个用于参考的列),如果value
非空,这个约束使得每一行表示的值与value
列的对应行相等 - "binary number value in range":所表示的值没有超出
T.into()
的范围
以上约束在
selector
为1
时生效,其中selector
也是configure()
方法的参数
赋值过程
写于BinaryNumberChip()
的assign()
方法:
对于输入的T
类型变量value
,调用其as_bits()
方法生成其二进制表示(由0、1构成的列表),依次把列表的各个元素填入相应的列
其他
BinaryNumberConfig
还实现了一些有用的方法:
-
value()
:返回指定的rotation
处,BinaryNumberConfig
表示的类型的Expression
-
value_equals()
:在指定的rotation
处,比较某个T
类型的值是否与BinaryNumberConfig
所表示的值相等;若相等,则返回1.expr()
,否则返回0.expr()
-
value_equals_expr()
:比较某个T
类型的值是否与一个长度为N
的Expression
列表(每个元素只能为0.expr()
或1.expr()
)表示的值相等;若相等,则返回1.expr()
,否则返回0.expr()
用法
以Scroll的copy_circuit.rs
为例:
tag
定义为BinaryNumberConfig<CopyDataType, 3>
;
使用value_equals()
方法判断tag
是否是某一类型,生成建立约束所需的condition
表达式
使用value()
方法得到某个rotation
处的tag
对应的表达式