mirror of
https://github.com/circify/circ.git
synced 2026-01-10 06:08:02 -05:00
* Configuration system. Kill DFL_T
* add circ::cfg::CircCfg that holds cfg info
* it's constructible from circ_opt::CircOpt
* implements clap::Args, so you can set it from your compiler's
CLI/envvars
* defined in external crate to keep clap out of our main build
* organized by circ module, but not feature gated
* no point: the build wouldn't meaningfully change
* includes a way to set the default field
* added circ::cfg::set and circ::cfg::cfg
* also circ::cfg::set_default and circ::cfg::set_cfg
* access a sync::once_cell, static configuration
* killed DFL_T
* workflows
* unit-tested component probably need to not read circ::cfg::cfg.
* compilers need to call circ::cfg::set or circ::cfg::set_default.
* rm dead features
11 KiB
11 KiB
Basic option system for CirC.
Tests (trycmd)
These tests are based on the example binary in examples/parser.rs.
It contains a clap::Parser that simply includes CircOpt:
use clap::Parser;
use circ_opt::CircOpt;
#[derive(Parser, Debug)]
struct BinaryOpt {
#[command(flatten)]
pub circ: CircOpt,
}
fn main() {
let opt = BinaryOpt::parse();
println!("{:#?}", opt);
}
Help Messages
$ parser --help
? 0
Options that configure CirC
Usage: parser [OPTIONS]
Options:
--r1cs-verified <VERIFIED>
Use the verified field-blaster
[env: R1CS_VERIFIED=]
[default: false]
[possible values: true, false]
--r1cs-div-by-zero <DIV_BY_ZERO>
Which field division-by-zero semantics to encode in R1cs
[env: R1CS_DIV_BY_ZERO=]
[default: incomplete]
Possible values:
- incomplete: Division-by-zero renders the circuit incomplete
- zero: Division-by-zero gives zero
- non-det: Division-by-zero gives a per-division unspecified result
--r1cs-lc-elim-thresh <LC_ELIM_THRESH>
linear combination constraints up to this size will be eliminated
[env: R1CS_LC_ELIM_THRESH=]
[default: 50]
--field-builtin <BUILTIN>
Which field to use
[env: FIELD_BUILTIN=]
[default: bls12381]
Possible values:
- bls12381: BLS12-381 scalar field
- bn254: BN-254 scalar field
--field-custom-modulus <CUSTOM_MODULUS>
Which modulus to use (overrides [FieldOpt::builtin])
[env: FIELD_CUSTOM_MODULUS=]
[default: ]
--zsharp-isolate-asserts <ISOLATE_ASSERTS>
In Z#, "isolate" assertions. That is, assertions in if/then/else expressions only take effect if that branch is active.
See `--branch-isolation` in [ZoKrates](https://zokrates.github.io/language/control_flow.html).
[env: ZSHARP_ISOLATE_ASSERTS=]
[default: false]
[possible values: true, false]
--datalog-rec-limit <N>
How many recursions to allow
[env: DATALOG_REC_LIMIT=]
[default: 5]
--datalog-lint-prim-rec <LINT_PRIM_REC>
Lint recursions that are allegedly primitive recursive
[env: DATALOG_LINT_PRIM_REC=]
[default: false]
[possible values: true, false]
-h, --help
Print help information (use `-h` for a summary)
$ parser -h
? 0
Options that configure CirC
Usage: parser [OPTIONS]
Options:
--r1cs-verified <VERIFIED>
Use the verified field-blaster [env: R1CS_VERIFIED=] [default: false] [possible values: true, false]
--r1cs-div-by-zero <DIV_BY_ZERO>
Which field division-by-zero semantics to encode in R1cs [env: R1CS_DIV_BY_ZERO=] [default: incomplete] [possible values: incomplete, zero, non-det]
--r1cs-lc-elim-thresh <LC_ELIM_THRESH>
linear combination constraints up to this size will be eliminated [env: R1CS_LC_ELIM_THRESH=] [default: 50]
--field-builtin <BUILTIN>
Which field to use [env: FIELD_BUILTIN=] [default: bls12381] [possible values: bls12381, bn254]
--field-custom-modulus <CUSTOM_MODULUS>
Which modulus to use (overrides [FieldOpt::builtin]) [env: FIELD_CUSTOM_MODULUS=] [default: ]
--zsharp-isolate-asserts <ISOLATE_ASSERTS>
In Z#, "isolate" assertions. That is, assertions in if/then/else expressions only take effect if that branch is active [env: ZSHARP_ISOLATE_ASSERTS=] [default: false] [possible values: true, false]
--datalog-rec-limit <N>
How many recursions to allow [env: DATALOG_REC_LIMIT=] [default: 5]
--datalog-lint-prim-rec <LINT_PRIM_REC>
Lint recursions that are allegedly primitive recursive [env: DATALOG_LINT_PRIM_REC=] [default: false] [possible values: true, false]
-h, --help
Print help information (use `--help` for more detail)
Defaults
$ parser
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
R1CS Options
$ parser --r1cs-verified true
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: true,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ parser --r1cs-verified false
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ parser --r1cs-div-by-zero non-det
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: NonDet,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ parser --r1cs-div-by-zero incomplete
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ parser --r1cs-div-by-zero zero
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Zero,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ R1CS_DIV_BY_ZERO=non-det parser --r1cs-lc-elim-thresh 11
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: NonDet,
lc_elim_thresh: 11,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ R1CS_VERIFIED=true R1CS_LC_ELIM_THRESH=10 parser
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: true,
div_by_zero: Incomplete,
lc_elim_thresh: 10,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
Field Options
$ FIELD_CUSTOM_MODULUS=7 parser --field-builtin bn254
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bn254,
custom_modulus: "7",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ FIELD_BUILTIN=bn254 parser --field-custom-modulus 7
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bn254,
custom_modulus: "7",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
Z# Options
$ ZSHARP_ISOLATE_ASSERTS=true parser
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: true,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
$ parser --zsharp-isolate-asserts true
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: true,
},
datalog: DatalogOpt {
rec_limit: 5,
lint_prim_rec: false,
},
},
}
Datalog Options
$ DATALOG_LINT_PRIM_REC=true parser --datalog-rec-limit 10
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 10,
lint_prim_rec: true,
},
},
}
$ DATALOG_REC_LIMIT=15 parser --datalog-lint-prim-rec true
? 0
BinaryOpt {
circ: CircOpt {
r1cs: R1csOpt {
verified: false,
div_by_zero: Incomplete,
lc_elim_thresh: 50,
},
field: FieldOpt {
builtin: Bls12381,
custom_modulus: "",
},
zsharp: ZsharpOpt {
isolate_asserts: false,
},
datalog: DatalogOpt {
rec_limit: 15,
lint_prim_rec: true,
},
},
}