Skip to content

Commit eaaa3c6

Browse files
committed
3*Value::function
1 parent 9409b5c commit eaaa3c6

File tree

1 file changed

+31
-20
lines changed

1 file changed

+31
-20
lines changed

hugr-passes/src/replace_types/handlers.rs

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -157,14 +157,17 @@ pub fn linearize_generic_array<AK: ArrayKind>(
157157
let option_ty = Type::from(option_sty.clone());
158158
let arrays_of_none = {
159159
let fn_none = {
160-
let mut dfb = DFGBuilder::new(inout_sig(vec![], option_ty.clone())).unwrap();
161-
let none = dfb
160+
let mut mb = dfb.module_root_builder();
161+
let mut fb = mb
162+
.define_function("mk_none", inout_sig(vec![], option_ty.clone()))
163+
.unwrap();
164+
let none = fb
162165
.add_dataflow_op(Tag::new(0, vec![type_row![], ty.clone().into()]), [])
163166
.unwrap();
164-
dfb.finish_hugr_with_outputs(none.outputs()).unwrap()
167+
fb.finish_with_outputs(none.outputs()).unwrap()
165168
};
166169
let repeats = vec![GenericArrayRepeat::<AK>::new(option_ty.clone(), *n); num_new];
167-
let fn_none = dfb.add_load_value(Value::function(fn_none).unwrap());
170+
let fn_none = dfb.load_func(fn_none.handle(), &[]).unwrap();
168171
repeats
169172
.into_iter()
170173
.map(|rpt| {
@@ -181,18 +184,21 @@ pub fn linearize_generic_array<AK: ArrayKind>(
181184
let copy_elem = {
182185
let mut io = vec![ty.clone(), i64_t.clone()];
183186
io.extend(vec![option_array.clone(); num_new]);
184-
let mut dfb = DFGBuilder::new(endo_sig(io)).unwrap();
185-
let mut inputs = dfb.input_wires();
187+
let mut mb = dfb.module_root_builder();
188+
let mut fb = mb
189+
.define_function(format!("copy{num_outports}"), endo_sig(io))
190+
.unwrap();
191+
let mut inputs = fb.input_wires();
186192
let elem = inputs.next().unwrap();
187193
let idx = inputs.next().unwrap();
188194
let opt_arrays = inputs.collect::<Vec<_>>();
189-
let [idx_usz] = dfb
195+
let [idx_usz] = fb
190196
.add_dataflow_op(ConvertOpDef::itousize.without_log_width(), [idx])
191197
.unwrap()
192198
.outputs_arr();
193199
let mut copies = lin
194200
.copy_discard_op(ty, num_outports)?
195-
.add(&mut dfb, [elem])
201+
.add(&mut fb, [elem])
196202
.map_err(|e| LinearizeError::NestedTemplateError(ty.clone(), e))?
197203
.outputs();
198204
let copy0 = copies.next().unwrap(); // We'll return this directly
@@ -207,32 +213,32 @@ pub fn linearize_generic_array<AK: ArrayKind>(
207213
.into_iter()
208214
.zip_eq(copies)
209215
.map(|(opt_array, copy1)| {
210-
let [tag] = dfb
216+
let [tag] = fb
211217
.add_dataflow_op(Tag::new(1, vec![type_row![], ty.clone().into()]), [copy1])
212218
.unwrap()
213219
.outputs_arr();
214-
let [set_result] = dfb
220+
let [set_result] = fb
215221
.add_dataflow_op(set_op.clone(), [opt_array, idx_usz, tag])
216222
.unwrap()
217223
.outputs_arr();
218224
// set should always be successful
219-
let [none, opt_array] = dfb
225+
let [none, opt_array] = fb
220226
.build_unwrap_sum(1, either_st.clone(), set_result)
221227
.unwrap();
222228
//the removed element is an option, which should always be none (and thus discardable)
223-
let [] = dfb
229+
let [] = fb
224230
.build_unwrap_sum(0, SumType::new_option(ty.clone()), none)
225231
.unwrap();
226232
opt_array
227233
})
228234
.collect::<Vec<_>>(); // stop borrowing dfb
229235

230-
let cst1 = dfb.add_load_value(ConstInt::new_u(6, 1).unwrap());
231-
let [new_idx] = dfb
236+
let cst1 = fb.add_load_value(ConstInt::new_u(6, 1).unwrap());
237+
let [new_idx] = fb
232238
.add_dataflow_op(IntOpDef::iadd.with_log_width(6), [idx, cst1])
233239
.unwrap()
234240
.outputs_arr();
235-
dfb.finish_hugr_with_outputs([copy0, new_idx].into_iter().chain(opt_arrays))
241+
fb.finish_with_outputs([copy0, new_idx].into_iter().chain(opt_arrays))
236242
.unwrap()
237243
};
238244
let [in_array] = dfb.input_wires_arr();
@@ -245,7 +251,7 @@ pub fn linearize_generic_array<AK: ArrayKind>(
245251
*n,
246252
);
247253

248-
let copy_elem = dfb.add_load_value(Value::function(copy_elem).unwrap());
254+
let copy_elem = dfb.load_func(copy_elem.handle(), &[]).unwrap();
249255
let cst0 = dfb.add_load_value(ConstInt::new_u(6, 0).unwrap());
250256

251257
let mut outs = dfb
@@ -263,15 +269,20 @@ pub fn linearize_generic_array<AK: ArrayKind>(
263269

264270
//3. Scan each array-of-options, 'unwrapping' each element into a non-option
265271
let unwrap_elem = {
266-
let mut dfb =
267-
DFGBuilder::new(inout_sig(Type::from(option_ty.clone()), ty.clone())).unwrap();
272+
let mut mb = dfb.module_root_builder();
273+
let mut dfb = mb
274+
.define_function(
275+
"unwrap",
276+
inout_sig(Type::from(option_ty.clone()), ty.clone()),
277+
)
278+
.unwrap();
268279
let [opt] = dfb.input_wires_arr();
269280
let [val] = dfb.build_unwrap_sum(1, option_sty.clone(), opt).unwrap();
270-
dfb.finish_hugr_with_outputs([val]).unwrap()
281+
dfb.finish_with_outputs([val]).unwrap()
271282
};
272283

273284
let unwrap_scan = GenericArrayScan::<AK>::new(option_ty.clone(), ty.clone(), vec![], *n);
274-
let unwrap_elem = dfb.add_load_value(Value::function(unwrap_elem).unwrap());
285+
let unwrap_elem = dfb.load_func(unwrap_elem.handle(), &[]).unwrap();
275286

276287
let out_arrays = std::iter::once(out_array1)
277288
.chain(opt_arrays.map(|opt_array| {

0 commit comments

Comments
 (0)