use crate::plonk::{self, Any};
use std::fmt;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct Column {
pub(super) column_type: Any,
pub(super) index: usize,
}
impl fmt::Display for Column {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Column('{:?}', {})", self.column_type, self.index)
}
}
impl From<(Any, usize)> for Column {
fn from((column_type, index): (Any, usize)) -> Self {
Column { column_type, index }
}
}
impl From<plonk::Column<Any>> for Column {
fn from(column: plonk::Column<Any>) -> Self {
Column {
column_type: *column.column_type(),
index: column.index(),
}
}
}
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
pub struct VirtualCell {
name: &'static str,
pub(super) column: Column,
pub(super) rotation: i32,
}
impl From<(Column, i32)> for VirtualCell {
fn from((column, rotation): (Column, i32)) -> Self {
VirtualCell {
name: "",
column,
rotation,
}
}
}
impl From<(&'static str, Column, i32)> for VirtualCell {
fn from((name, column, rotation): (&'static str, Column, i32)) -> Self {
VirtualCell {
name,
column,
rotation,
}
}
}
impl From<plonk::VirtualCell> for VirtualCell {
fn from(c: plonk::VirtualCell) -> Self {
VirtualCell {
name: "",
column: c.column.into(),
rotation: c.rotation.0,
}
}
}
impl fmt::Display for VirtualCell {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "{}@{}", self.column, self.rotation)?;
if !self.name.is_empty() {
write!(f, "({})", self.name)?;
}
Ok(())
}
}
#[derive(Debug, PartialEq)]
pub struct Gate {
pub(super) index: usize,
pub(super) name: &'static str,
}
impl fmt::Display for Gate {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Gate {} ('{}')", self.index, self.name)
}
}
impl From<(usize, &'static str)> for Gate {
fn from((index, name): (usize, &'static str)) -> Self {
Gate { index, name }
}
}
#[derive(Debug, PartialEq)]
pub struct Constraint {
pub(super) gate: Gate,
pub(super) index: usize,
pub(super) name: &'static str,
}
impl fmt::Display for Constraint {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"Constraint {}{} in gate {} ('{}')",
self.index,
if self.name.is_empty() {
String::new()
} else {
format!(" ('{}')", self.name)
},
self.gate.index,
self.gate.name,
)
}
}
impl From<(Gate, usize, &'static str)> for Constraint {
fn from((gate, index, name): (Gate, usize, &'static str)) -> Self {
Constraint { gate, index, name }
}
}
#[derive(Clone, Debug, PartialEq)]
pub struct Region {
pub(super) index: usize,
pub(super) name: String,
}
impl fmt::Display for Region {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "Region {} ('{}')", self.index, self.name)
}
}
impl From<(usize, String)> for Region {
fn from((index, name): (usize, String)) -> Self {
Region { index, name }
}
}
impl From<(usize, &str)> for Region {
fn from((index, name): (usize, &str)) -> Self {
Region {
index,
name: name.to_owned(),
}
}
}