add "short id" for gates, for easier interop with third-party tooling (untested)

This commit is contained in:
Balazs Komuves 2024-12-05 00:12:47 +01:00
parent 99aac4dd08
commit 301ae79b6f
No known key found for this signature in database
GPG Key ID: F63B7AEF18435562
17 changed files with 69 additions and 0 deletions

View File

@ -65,6 +65,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticGate
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("ArithmeticGate:{}",self.num_ops)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops)
}

View File

@ -61,6 +61,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ArithmeticExte
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("ArithmeticExtensionGate:{}",self.num_ops)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops)
}

View File

@ -56,6 +56,10 @@ impl<F: RichField + Extendable<D>, const D: usize, const B: usize> Gate<F, D> fo
format!("{self:?} + Base: {B}")
}
fn short_id(&self) -> String {
format!("BaseSumGate:{}",self.num_limbs)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_limbs)
}

View File

@ -46,6 +46,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ConstantGate {
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("ConstantGate:{}",self.num_consts)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_consts)
}

View File

@ -178,6 +178,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for CosetInterpola
format!("{self:?}<D={D}>")
}
fn short_id(&self) -> String {
format!("CosetInterpolationGate:{}",self.subgroup_bits)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.subgroup_bits)?;
dst.write_usize(self.degree)?;

View File

@ -82,6 +82,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for Exponentiation
format!("{self:?}<D={D}>")
}
fn short_id(&self) -> String {
format!("ExponentiationGate:{}",self.num_power_bits)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_power_bits)
}

View File

@ -56,6 +56,11 @@ pub trait Gate<F: RichField + Extendable<D>, const D: usize>: 'static + Send + S
/// This is used as differentiating tag in gate serializers.
fn id(&self) -> String;
/// Another, more friendly identifier for easier interop with third-party tooling
fn short_id(&self) -> String {
self.id()
}
/// Serializes this custom gate to the targeted byte buffer, with the provided [`CommonCircuitData`].
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()>;

View File

@ -78,6 +78,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupGate {
)
}
fn short_id(&self) -> String {
format!("LookupGate:{}",self.num_slots)
}
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_slots)?;
for (i, lut) in common_data.luts.iter().enumerate() {

View File

@ -91,6 +91,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for LookupTableGat
)
}
fn short_id(&self) -> String {
format!("LookupTableGate:{}",self.num_slots)
}
fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_slots)?;
dst.write_usize(self.last_lut_row)?;

View File

@ -58,6 +58,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for MulExtensionGa
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("MulExtensionGenerator:{}",self.num_ops)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops)
}

View File

@ -20,6 +20,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for NoopGate {
"NoopGate".into()
}
fn short_id(&self) -> String {
"NoopGate".into()
}
fn serialize(
&self,
_dst: &mut Vec<u8>,

View File

@ -106,6 +106,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PoseidonGate<F
format!("{self:?}<WIDTH={SPONGE_WIDTH}>")
}
fn short_id(&self) -> String {
format!("PoseidonGate:{}",SPONGE_WIDTH)
}
fn serialize(
&self,
_dst: &mut Vec<u8>,

View File

@ -125,6 +125,10 @@ impl<F: RichField + Extendable<D> + Poseidon, const D: usize> Gate<F, D> for Pos
format!("{self:?}<WIDTH={SPONGE_WIDTH}>")
}
fn short_id(&self) -> String {
format!("PoseidonMdsGate:{}",SPONGE_WIDTH)
}
fn serialize(
&self,
_dst: &mut Vec<u8>,

View File

@ -33,6 +33,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for PublicInputGat
"PublicInputGate".into()
}
fn short_id(&self) -> String {
"PublicInputGate".into()
}
fn serialize(
&self,
_dst: &mut Vec<u8>,

View File

@ -127,6 +127,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for RandomAccessGa
format!("{self:?}<D={D}>")
}
fn short_id(&self) -> String {
format!("RandomAccessGate:{}",self.bits)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.bits)?;
dst.write_usize(self.num_copies)?;

View File

@ -67,6 +67,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingGate<D
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("ReducingGate:{}",self.num_coeffs)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_coeffs)?;
Ok(())

View File

@ -70,6 +70,10 @@ impl<F: RichField + Extendable<D>, const D: usize> Gate<F, D> for ReducingExtens
format!("{self:?}")
}
fn short_id(&self) -> String {
format!("ReducingExtensionGate:{}",self.num_coeffs)
}
fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_coeffs)?;
Ok(())