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:?}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops) 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:?}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops) 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}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_limbs) 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:?}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_consts) 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}>") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.subgroup_bits)?; dst.write_usize(self.subgroup_bits)?;
dst.write_usize(self.degree)?; 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}>") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_power_bits) 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. /// This is used as differentiating tag in gate serializers.
fn id(&self) -> String; 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`]. /// 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<()>; 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<()> { fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_slots)?; dst.write_usize(self.num_slots)?;
for (i, lut) in common_data.luts.iter().enumerate() { 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<()> { fn serialize(&self, dst: &mut Vec<u8>, common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_slots)?; dst.write_usize(self.num_slots)?;
dst.write_usize(self.last_lut_row)?; 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:?}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_ops) 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() "NoopGate".into()
} }
fn short_id(&self) -> String {
"NoopGate".into()
}
fn serialize( fn serialize(
&self, &self,
_dst: &mut Vec<u8>, _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}>") format!("{self:?}<WIDTH={SPONGE_WIDTH}>")
} }
fn short_id(&self) -> String {
format!("PoseidonGate:{}",SPONGE_WIDTH)
}
fn serialize( fn serialize(
&self, &self,
_dst: &mut Vec<u8>, _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}>") format!("{self:?}<WIDTH={SPONGE_WIDTH}>")
} }
fn short_id(&self) -> String {
format!("PoseidonMdsGate:{}",SPONGE_WIDTH)
}
fn serialize( fn serialize(
&self, &self,
_dst: &mut Vec<u8>, _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() "PublicInputGate".into()
} }
fn short_id(&self) -> String {
"PublicInputGate".into()
}
fn serialize( fn serialize(
&self, &self,
_dst: &mut Vec<u8>, _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}>") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.bits)?; dst.write_usize(self.bits)?;
dst.write_usize(self.num_copies)?; 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:?}") 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<()> { fn serialize(&self, dst: &mut Vec<u8>, _common_data: &CommonCircuitData<F, D>) -> IoResult<()> {
dst.write_usize(self.num_coeffs)?; dst.write_usize(self.num_coeffs)?;
Ok(()) Ok(())

View File

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