Skip to content

Commit 79029b8

Browse files
authored
refactor!: Separate Signature from FuncValueType by parametrizing Type(/Row)/etc. (#1138)
* Type now means a single type, not a row variable; TypeRV can be a single type *or* a row variable. (Type --Into--> TypeRV). * These are actually parameterizations: `TypeBase<NoRV>` (NoRV is a type with no instances) vs `TypeBase<RowVariable>` (RowVariable is a struct i.e. index + bound) * Similarly for the other type structures - all names have changed uniformly except FunctionType: | No Row Vars | With Row Vars | Generic | | ----- | ----- | ----- | | Type | TypeRV | `TypeBase<RV>` | | TypeRow | TypeRowRV | `TypeRowBase<RV>` | | Signature | FuncValueType | `FuncTypeBase<RV>` | | PolyFuncType | PolyFuncTypeRV | `PolyFuncTypeBase<RV>` | * This allows us to make static guarantees (and remove dynamic checks): * node signatures do not have row variables as inputs or outputs * Neither do FuncDefn type schemes, even though they may quantify over row variables * "port"-indexing methods are specific to Signature (not FuncValueType) - this justifies the exceptional naming Planning to rename PolyFuncType to (Op/Fn)TypeScheme in a followup PR (lots of fields want renaming too, whereas many FunctionType things are *already* called `signature`!) **One question** is that currently `Type` and `TypeRV` are aliases for instantiations of `TypeBase`. An alternative is to parameterize `Type<RV: MaybeRV = NoRV>` and define as alias only `type TypeRV = Type<RowVariable>` (no `TypeBase`). A type annotation e.g. `x: Type` then uses the default, but a call like `Type::new_function` then tries to infer a unique possible parameter. This would slightly worsen Hugr-building code (some code like `let x = Type::new_function` have to become either `let x = Type::<NoRV>::new_function` or `let x: Type = Type::new_function` - sadly the *default* for RV is ignored for members/namespacing but not when forming a type, see rust-lang/rust#98931). OTOH some OpDef code would be a bit easier (needs fewer explicit `RV` suffices). In general I think we favour making Hugr-building code as easy as possible over OpDef code, but there is always the question of, *how much* easier etc...see commit bc565ba which removed defaults for Type (with an earlier parametrization by bool true/false rather than by RowVariable/NoRV). (And actually that commit understates the simplification - there were a bunch more `let x:Type`s required for the default method that can be removed for the always-explicit method, I took these out in 23db41d, so maybe we should stick with always-explicit.) * [ ] TODO python classes need names updating to match, etc. BREAKING CHANGE: (1) In OpDefs, Type/TypeRow/FunctionType/PolyFuncType will generally need replacing by TypeRV/TypeRowRV/FuncValueType/PolyFuncTypeRV. (2) FuncValueType omits the various numbered-"port" accessors, you really shouldn't be doing that except on a Signature.... (4) SignatureError::RowVarWhereTypeExpected now contains a RowVariable struct (including bound) rather than only the index
1 parent 6f8dac2 commit 79029b8

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1368
-1033
lines changed

hugr-cli/tests/cli.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use hugr_core::{
1212
builder::{Container, Dataflow, DataflowHugr},
1313
extension::prelude::{BOOL_T, QB_T},
1414
type_row,
15-
types::FunctionType,
15+
types::Signature,
1616
Hugr,
1717
};
1818
use predicates::{prelude::*, str::contains};
@@ -25,7 +25,7 @@ fn cmd() -> Command {
2525

2626
#[fixture]
2727
fn test_hugr() -> Hugr {
28-
let df = DFGBuilder::new(FunctionType::new_endo(type_row![BOOL_T])).unwrap();
28+
let df = DFGBuilder::new(Signature::new_endo(type_row![BOOL_T])).unwrap();
2929
let [i] = df.input_wires_arr();
3030
df.finish_prelude_hugr_with_outputs([i]).unwrap()
3131
}
@@ -83,7 +83,7 @@ fn test_mermaid(test_hugr_file: NamedTempFile, mut cmd: Command) {
8383

8484
#[rstest]
8585
fn test_bad_hugr(mut cmd: Command) {
86-
let df = DFGBuilder::new(FunctionType::new_endo(type_row![QB_T])).unwrap();
86+
let df = DFGBuilder::new(Signature::new_endo(type_row![QB_T])).unwrap();
8787
let bad_hugr = df.hugr().clone();
8888

8989
let bad_hugr_string = serde_json::to_string(&bad_hugr).unwrap();

hugr-core/src/builder.rs

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
//! # use hugr::builder::{BuildError, BuildHandle, Container, DFGBuilder, Dataflow, DataflowHugr, ModuleBuilder, DataflowSubContainer, HugrBuilder};
3131
//! use hugr::extension::prelude::BOOL_T;
3232
//! use hugr::std_extensions::logic::{EXTENSION_ID, LOGIC_REG, NotOp};
33-
//! use hugr::types::FunctionType;
33+
//! use hugr::types::Signature;
3434
//!
3535
//! # fn doctest() -> Result<(), BuildError> {
3636
//! let hugr = {
@@ -42,7 +42,7 @@
4242
//! let _dfg_handle = {
4343
//! let mut dfg = module_builder.define_function(
4444
//! "main",
45-
//! FunctionType::new_endo(BOOL_T).with_extension_delta(EXTENSION_ID),
45+
//! Signature::new_endo(BOOL_T).with_extension_delta(EXTENSION_ID),
4646
//! )?;
4747
//!
4848
//! // Get the wires from the function inputs.
@@ -59,7 +59,7 @@
5959
//! let _circuit_handle = {
6060
//! let mut dfg = module_builder.define_function(
6161
//! "circuit",
62-
//! FunctionType::new_endo(vec![BOOL_T, BOOL_T])
62+
//! Signature::new_endo(vec![BOOL_T, BOOL_T])
6363
//! .with_extension_delta(EXTENSION_ID),
6464
//! )?;
6565
//! let mut circuit = dfg.as_circuit(dfg.input_wires());
@@ -93,7 +93,7 @@ use crate::hugr::ValidationError;
9393
use crate::ops::handle::{BasicBlockID, CfgID, ConditionalID, DfgID, FuncID, TailLoopID};
9494
use crate::ops::{NamedOp, OpType};
9595
use crate::types::Type;
96-
use crate::types::{ConstTypeError, FunctionType, TypeRow};
96+
use crate::types::{ConstTypeError, Signature, TypeRow};
9797
use crate::{Node, Port, Wire};
9898

9999
pub mod handle;
@@ -124,14 +124,14 @@ pub use circuit::{CircuitBuildError, CircuitBuilder};
124124

125125
/// Return a FunctionType with the same input and output types (specified)
126126
/// whose extension delta, when used in a non-FuncDefn container, will be inferred.
127-
pub fn endo_ft(types: impl Into<TypeRow>) -> FunctionType {
128-
FunctionType::new_endo(types).with_extension_delta(TO_BE_INFERRED)
127+
pub fn endo_sig(types: impl Into<TypeRow>) -> Signature {
128+
Signature::new_endo(types).with_extension_delta(TO_BE_INFERRED)
129129
}
130130

131131
/// Return a FunctionType with the specified input and output types
132132
/// whose extension delta, when used in a non-FuncDefn container, will be inferred.
133-
pub fn inout_ft(inputs: impl Into<TypeRow>, outputs: impl Into<TypeRow>) -> FunctionType {
134-
FunctionType::new(inputs, outputs).with_extension_delta(TO_BE_INFERRED)
133+
pub fn inout_sig(inputs: impl Into<TypeRow>, outputs: impl Into<TypeRow>) -> Signature {
134+
Signature::new(inputs, outputs).with_extension_delta(TO_BE_INFERRED)
135135
}
136136

137137
#[derive(Debug, Clone, PartialEq, Error)]
@@ -236,7 +236,7 @@ pub(crate) mod test {
236236
use crate::hugr::{views::HugrView, HugrMut};
237237
use crate::ops;
238238
use crate::std_extensions::arithmetic::float_ops::FLOAT_OPS_REGISTRY;
239-
use crate::types::{FunctionType, PolyFuncType, Type};
239+
use crate::types::{PolyFuncType, Signature, Type};
240240
use crate::{type_row, Hugr};
241241

242242
use super::handle::BuildHandle;
@@ -272,24 +272,23 @@ pub(crate) mod test {
272272

273273
#[fixture]
274274
pub(crate) fn simple_dfg_hugr() -> Hugr {
275-
let dfg_builder =
276-
DFGBuilder::new(FunctionType::new(type_row![BIT], type_row![BIT])).unwrap();
275+
let dfg_builder = DFGBuilder::new(Signature::new(type_row![BIT], type_row![BIT])).unwrap();
277276
let [i1] = dfg_builder.input_wires_arr();
278277
dfg_builder.finish_prelude_hugr_with_outputs([i1]).unwrap()
279278
}
280279

281280
#[fixture]
282281
pub(crate) fn simple_cfg_hugr() -> Hugr {
283282
let mut cfg_builder =
284-
CFGBuilder::new(FunctionType::new(type_row![NAT], type_row![NAT])).unwrap();
283+
CFGBuilder::new(Signature::new(type_row![NAT], type_row![NAT])).unwrap();
285284
super::cfg::test::build_basic_cfg(&mut cfg_builder).unwrap();
286285
cfg_builder.finish_prelude_hugr().unwrap()
287286
}
288287

289288
/// A helper method which creates a DFG rooted hugr with Input and Output node
290289
/// only (no wires), given a function type with extension delta.
291290
// TODO consider taking two type rows and using TO_BE_INFERRED
292-
pub(crate) fn closed_dfg_root_hugr(signature: FunctionType) -> Hugr {
291+
pub(crate) fn closed_dfg_root_hugr(signature: Signature) -> Hugr {
293292
let mut hugr = Hugr::new(ops::DFG {
294293
signature: signature.clone(),
295294
});

hugr-core/src/builder/build_traits.rs

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,8 @@ use crate::{
1818
types::EdgeKind,
1919
};
2020

21-
use crate::extension::{
22-
ExtensionRegistry, ExtensionSet, SignatureError, PRELUDE_REGISTRY, TO_BE_INFERRED,
23-
};
24-
use crate::types::{FunctionType, PolyFuncType, Type, TypeArg, TypeRow};
21+
use crate::extension::{ExtensionRegistry, ExtensionSet, PRELUDE_REGISTRY, TO_BE_INFERRED};
22+
use crate::types::{PolyFuncType, Signature, Type, TypeArg, TypeRow};
2523

2624
use itertools::Itertools;
2725

@@ -276,7 +274,7 @@ pub trait Dataflow: Container {
276274
// TODO: Should this be one function, or should there be a temporary "op" one like with the others?
277275
fn dfg_builder(
278276
&mut self,
279-
signature: FunctionType,
277+
signature: Signature,
280278
input_wires: impl IntoIterator<Item = Wire>,
281279
) -> Result<DFGBuilder<&mut Hugr>, BuildError> {
282280
let op = ops::DFG {
@@ -297,7 +295,7 @@ pub trait Dataflow: Container {
297295
) -> Result<DFGBuilder<&mut Hugr>, BuildError> {
298296
let (types, input_wires): (Vec<Type>, Vec<Wire>) = inputs.into_iter().unzip();
299297
self.dfg_builder(
300-
FunctionType::new_endo(types).with_extension_delta(TO_BE_INFERRED),
298+
Signature::new_endo(types).with_extension_delta(TO_BE_INFERRED),
301299
input_wires,
302300
)
303301
}
@@ -325,7 +323,7 @@ pub trait Dataflow: Container {
325323
let (cfg_node, _) = add_node_with_wires(
326324
self,
327325
ops::CFG {
328-
signature: FunctionType::new(inputs.clone(), output_types.clone())
326+
signature: Signature::new(inputs.clone(), output_types.clone())
329327
.with_extension_delta(extension_delta),
330328
},
331329
input_wires,
@@ -658,14 +656,6 @@ fn add_node_with_wires<T: Dataflow + ?Sized>(
658656
inputs: impl IntoIterator<Item = Wire>,
659657
) -> Result<(Node, usize), BuildError> {
660658
let op = nodetype.into();
661-
// Check there are no row variables, as that would prevent us
662-
// from indexing into the node's ports in order to wire up
663-
op.dataflow_signature()
664-
.as_ref()
665-
.and_then(FunctionType::find_rowvar)
666-
.map_or(Ok(()), |(idx, _)| {
667-
Err(SignatureError::RowVarWhereTypeExpected { idx })
668-
})?;
669659
let num_outputs = op.value_output_count();
670660
let op_node = data_builder.add_child_node(op.clone());
671661

hugr-core/src/builder/cfg.rs

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::{
1111
};
1212
use crate::{
1313
extension::{ExtensionRegistry, ExtensionSet},
14-
types::FunctionType,
14+
types::Signature,
1515
};
1616
use crate::{hugr::views::HugrView, types::TypeRow};
1717

@@ -46,17 +46,17 @@ use crate::{hugr::HugrMut, type_row, Hugr};
4646
/// +------------+
4747
/// */
4848
/// use hugr::{
49-
/// builder::{BuildError, CFGBuilder, Container, Dataflow, HugrBuilder, endo_ft, inout_ft},
49+
/// builder::{BuildError, CFGBuilder, Container, Dataflow, HugrBuilder, endo_sig, inout_sig},
5050
/// extension::{prelude, ExtensionSet},
5151
/// ops, type_row,
52-
/// types::{FunctionType, SumType, Type},
52+
/// types::{Signature, SumType, Type},
5353
/// Hugr,
5454
/// };
5555
///
5656
/// const NAT: Type = prelude::USIZE_T;
5757
///
5858
/// fn make_cfg() -> Result<Hugr, BuildError> {
59-
/// let mut cfg_builder = CFGBuilder::new(FunctionType::new(type_row![NAT], type_row![NAT]))?;
59+
/// let mut cfg_builder = CFGBuilder::new(Signature::new_endo(NAT))?;
6060
///
6161
/// // Outputs from basic blocks must be packed in a sum which corresponds to
6262
/// // which successor to pick. We'll either choose the first branch and pass
@@ -84,7 +84,7 @@ use crate::{hugr::HugrMut, type_row, Hugr};
8484
/// // `NAT` arguments: one from the `sum_variants` type, and another from the
8585
/// // entry node's `other_outputs`.
8686
/// let mut successor_builder = cfg_builder.simple_block_builder(
87-
/// inout_ft(type_row![NAT, NAT], NAT),
87+
/// inout_sig(type_row![NAT, NAT], NAT),
8888
/// 1, // only one successor to this block
8989
/// )?;
9090
/// let successor_a = {
@@ -98,7 +98,7 @@ use crate::{hugr::HugrMut, type_row, Hugr};
9898
/// };
9999
///
100100
/// // The only argument to this block is the entry node's `other_outputs`.
101-
/// let mut successor_builder = cfg_builder.simple_block_builder(endo_ft(NAT), 1)?;
101+
/// let mut successor_builder = cfg_builder.simple_block_builder(endo_sig(NAT), 1)?;
102102
/// let successor_b = {
103103
/// let sum_unary = successor_builder.add_load_value(ops::Value::unary_unit_sum());
104104
/// let [in_wire] = successor_builder.input_wires_arr();
@@ -151,7 +151,7 @@ impl<H: AsMut<Hugr> + AsRef<Hugr>> SubContainer for CFGBuilder<H> {
151151

152152
impl CFGBuilder<Hugr> {
153153
/// New CFG rooted HUGR builder
154-
pub fn new(signature: FunctionType) -> Result<Self, BuildError> {
154+
pub fn new(signature: Signature) -> Result<Self, BuildError> {
155155
let cfg_op = ops::CFG {
156156
signature: signature.clone(),
157157
};
@@ -272,7 +272,7 @@ impl<B: AsMut<Hugr> + AsRef<Hugr>> CFGBuilder<B> {
272272
/// This function will return an error if there is an error adding the node.
273273
pub fn simple_block_builder(
274274
&mut self,
275-
signature: FunctionType,
275+
signature: Signature,
276276
n_cases: usize,
277277
) -> Result<BlockBuilder<&mut Hugr>, BuildError> {
278278
self.block_builder_exts(
@@ -463,7 +463,7 @@ pub(crate) mod test {
463463
let build_result = {
464464
let mut module_builder = ModuleBuilder::new();
465465
let mut func_builder = module_builder
466-
.define_function("main", FunctionType::new(vec![NAT], type_row![NAT]))?;
466+
.define_function("main", Signature::new(vec![NAT], type_row![NAT]))?;
467467
let _f_id = {
468468
let [int] = func_builder.input_wires_arr();
469469

@@ -489,7 +489,7 @@ pub(crate) mod test {
489489
}
490490
#[test]
491491
fn basic_cfg_hugr() -> Result<(), BuildError> {
492-
let mut cfg_builder = CFGBuilder::new(FunctionType::new(type_row![NAT], type_row![NAT]))?;
492+
let mut cfg_builder = CFGBuilder::new(Signature::new(type_row![NAT], type_row![NAT]))?;
493493
build_basic_cfg(&mut cfg_builder)?;
494494
assert_matches!(cfg_builder.finish_prelude_hugr(), Ok(_));
495495

@@ -511,8 +511,8 @@ pub(crate) mod test {
511511
let sum = entry_b.make_sum(1, sum2_variants, [inw])?;
512512
entry_b.finish_with_outputs(sum, [])?
513513
};
514-
let mut middle_b = cfg_builder
515-
.simple_block_builder(FunctionType::new(type_row![NAT], type_row![NAT]), 1)?;
514+
let mut middle_b =
515+
cfg_builder.simple_block_builder(Signature::new(type_row![NAT], type_row![NAT]), 1)?;
516516
let middle = {
517517
let c = middle_b.add_load_const(ops::Value::unary_unit_sum());
518518
let [inw] = middle_b.input_wires_arr();
@@ -526,7 +526,7 @@ pub(crate) mod test {
526526
}
527527
#[test]
528528
fn test_dom_edge() -> Result<(), BuildError> {
529-
let mut cfg_builder = CFGBuilder::new(FunctionType::new(type_row![NAT], type_row![NAT]))?;
529+
let mut cfg_builder = CFGBuilder::new(Signature::new(type_row![NAT], type_row![NAT]))?;
530530
let sum_tuple_const = cfg_builder.add_constant(ops::Value::unary_unit_sum());
531531
let sum_variants = vec![type_row![]];
532532

@@ -542,7 +542,7 @@ pub(crate) mod test {
542542
entry_b.finish_with_outputs(sum, [])?
543543
};
544544
let mut middle_b =
545-
cfg_builder.simple_block_builder(FunctionType::new(type_row![], type_row![NAT]), 1)?;
545+
cfg_builder.simple_block_builder(Signature::new(type_row![], type_row![NAT]), 1)?;
546546
let middle = {
547547
let c = middle_b.load_const(&sum_tuple_const);
548548
middle_b.finish_with_outputs(c, [inw])?
@@ -557,11 +557,11 @@ pub(crate) mod test {
557557

558558
#[test]
559559
fn test_non_dom_edge() -> Result<(), BuildError> {
560-
let mut cfg_builder = CFGBuilder::new(FunctionType::new(type_row![NAT], type_row![NAT]))?;
560+
let mut cfg_builder = CFGBuilder::new(Signature::new(type_row![NAT], type_row![NAT]))?;
561561
let sum_tuple_const = cfg_builder.add_constant(ops::Value::unary_unit_sum());
562562
let sum_variants = vec![type_row![]];
563-
let mut middle_b = cfg_builder
564-
.simple_block_builder(FunctionType::new(type_row![NAT], type_row![NAT]), 1)?;
563+
let mut middle_b =
564+
cfg_builder.simple_block_builder(Signature::new(type_row![NAT], type_row![NAT]), 1)?;
565565
let [inw] = middle_b.input_wires_arr();
566566
let middle = {
567567
let c = middle_b.load_const(&sum_tuple_const);

hugr-core/src/builder/circuit.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -254,13 +254,13 @@ mod test {
254254
extension::prelude::BOOL_T,
255255
ops::{custom::OpaqueOp, CustomOp},
256256
type_row,
257-
types::FunctionType,
257+
types::Signature,
258258
};
259259

260260
#[test]
261261
fn simple_linear() {
262262
let build_res = build_main(
263-
FunctionType::new(type_row![QB, QB], type_row![QB, QB])
263+
Signature::new(type_row![QB, QB], type_row![QB, QB])
264264
.with_extension_delta(test_quantum_extension::EXTENSION_ID)
265265
.with_extension_delta(float_types::EXTENSION_ID)
266266
.into(),
@@ -300,10 +300,10 @@ mod test {
300300
"MyOp",
301301
"unknown op".to_string(),
302302
vec![],
303-
FunctionType::new(vec![QB, NAT], vec![QB]),
303+
Signature::new(vec![QB, NAT], vec![QB]),
304304
));
305305
let build_res = build_main(
306-
FunctionType::new(type_row![QB, QB, NAT], type_row![QB, QB, BOOL_T])
306+
Signature::new(type_row![QB, QB, NAT], type_row![QB, QB, BOOL_T])
307307
.with_extension_delta(test_quantum_extension::EXTENSION_ID)
308308
.into(),
309309
|mut f_build| {
@@ -330,7 +330,7 @@ mod test {
330330
#[test]
331331
fn ancillae() {
332332
let build_res = build_main(
333-
FunctionType::new_endo(QB)
333+
Signature::new_endo(QB)
334334
.with_extension_delta(test_quantum_extension::EXTENSION_ID)
335335
.into(),
336336
|mut f_build| {
@@ -368,7 +368,7 @@ mod test {
368368
#[test]
369369
fn circuit_builder_errors() {
370370
let _build_res = build_main(
371-
FunctionType::new_endo(type_row![QB, QB]).into(),
371+
Signature::new_endo(type_row![QB, QB]).into(),
372372
|mut f_build| {
373373
let mut circ = f_build.as_circuit(f_build.input_wires());
374374
let [q0, q1] = circ.tracked_units_arr();

hugr-core/src/builder/conditional.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::extension::ExtensionRegistry;
22
use crate::hugr::views::HugrView;
33
use crate::ops::dataflow::DataflowOpTrait;
4-
use crate::types::{FunctionType, TypeRow};
4+
use crate::types::{Signature, TypeRow};
55

66
use crate::ops;
77
use crate::ops::handle::CaseID;
@@ -118,7 +118,7 @@ impl<B: AsMut<Hugr> + AsRef<Hugr>> ConditionalBuilder<B> {
118118

119119
let outputs = cond.outputs;
120120
let case_op = ops::Case {
121-
signature: FunctionType::new(inputs.clone(), outputs.clone())
121+
signature: Signature::new(inputs.clone(), outputs.clone())
122122
.with_extension_delta(extension_delta.clone()),
123123
};
124124
let case_node =
@@ -134,7 +134,7 @@ impl<B: AsMut<Hugr> + AsRef<Hugr>> ConditionalBuilder<B> {
134134
let dfg_builder = DFGBuilder::create_with_io(
135135
self.hugr_mut(),
136136
case_node,
137-
FunctionType::new(inputs, outputs).with_extension_delta(extension_delta),
137+
Signature::new(inputs, outputs).with_extension_delta(extension_delta),
138138
)?;
139139

140140
Ok(CaseBuilder::from_dfg_builder(dfg_builder))
@@ -186,7 +186,7 @@ impl ConditionalBuilder<Hugr> {
186186

187187
impl CaseBuilder<Hugr> {
188188
/// Initialize a Case rooted HUGR
189-
pub fn new(signature: FunctionType) -> Result<Self, BuildError> {
189+
pub fn new(signature: Signature) -> Result<Self, BuildError> {
190190
let op = ops::Case {
191191
signature: signature.clone(),
192192
};
@@ -233,7 +233,7 @@ mod test {
233233
let build_result: Result<Hugr, BuildError> = {
234234
let mut module_builder = ModuleBuilder::new();
235235
let mut fbuild = module_builder
236-
.define_function("main", FunctionType::new(type_row![NAT], type_row![NAT]))?;
236+
.define_function("main", Signature::new(type_row![NAT], type_row![NAT]))?;
237237
let tru_const = fbuild.add_constant(Value::true_val());
238238
let _fdef = {
239239
let const_wire = fbuild.load_const(&tru_const);

0 commit comments

Comments
 (0)