forked from M-Labs/nac3
artiq: reimplement polymorphic_print for ndarray
This commit is contained in:
parent
ad5506bff1
commit
ef391b81aa
|
@ -1,8 +1,7 @@
|
||||||
use nac3core::{
|
use nac3core::{
|
||||||
codegen::{
|
codegen::{
|
||||||
classes::{ListValue, NDArrayValue, RangeValue, UntypedArrayLikeAccessor},
|
classes::{ListValue, RangeValue, UntypedArrayLikeAccessor},
|
||||||
expr::{destructure_range, gen_call},
|
expr::{destructure_range, gen_call},
|
||||||
irrt::call_ndarray_calc_size,
|
|
||||||
llvm_intrinsics::{call_int_smax, call_stackrestore, call_stacksave},
|
llvm_intrinsics::{call_int_smax, call_stackrestore, call_stacksave},
|
||||||
model::*,
|
model::*,
|
||||||
object::{any::AnyObject, ndarray::NDArrayObject},
|
object::{any::AnyObject, ndarray::NDArrayObject},
|
||||||
|
@ -1073,56 +1072,46 @@ fn polymorphic_print<'ctx>(
|
||||||
}
|
}
|
||||||
|
|
||||||
TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => {
|
TypeEnum::TObj { obj_id, .. } if *obj_id == PrimDef::NDArray.id() => {
|
||||||
let (elem_ty, _) = unpack_ndarray_var_tys(&mut ctx.unifier, ty);
|
|
||||||
|
|
||||||
fmt.push_str("array([");
|
fmt.push_str("array([");
|
||||||
flush(ctx, generator, &mut fmt, &mut args);
|
flush(ctx, generator, &mut fmt, &mut args);
|
||||||
|
|
||||||
let val = NDArrayValue::from_ptr_val(value.into_pointer_value(), llvm_usize, None);
|
let ndarray = AnyObject { ty, value };
|
||||||
let len = call_ndarray_calc_size(generator, ctx, &val.dim_sizes(), (None, None));
|
let ndarray = NDArrayObject::from_object(generator, ctx, ndarray);
|
||||||
let last =
|
|
||||||
ctx.builder.build_int_sub(len, llvm_usize.const_int(1, false), "").unwrap();
|
|
||||||
|
|
||||||
gen_for_callback_incrementing(
|
let num_0 = Int(SizeT).const_0(generator, ctx.ctx);
|
||||||
generator,
|
|
||||||
ctx,
|
|
||||||
None,
|
|
||||||
llvm_usize.const_zero(),
|
|
||||||
(len, false),
|
|
||||||
|generator, ctx, _, i| {
|
|
||||||
let elem = unsafe { val.data().get_unchecked(ctx, generator, &i, None) };
|
|
||||||
|
|
||||||
polymorphic_print(
|
// Print `ndarray` as a flat list delimited by interspersed with ", \0"
|
||||||
ctx,
|
ndarray.foreach(generator, ctx, |generator, ctx, _, hdl| {
|
||||||
generator,
|
let i = hdl.get_index(generator, ctx);
|
||||||
&[(elem_ty, elem.into())],
|
let scalar = hdl.get_scalar(generator, ctx);
|
||||||
"",
|
|
||||||
None,
|
|
||||||
true,
|
|
||||||
as_rtio,
|
|
||||||
)?;
|
|
||||||
|
|
||||||
|
// if (i != 0) { puts(", "); }
|
||||||
gen_if_callback(
|
gen_if_callback(
|
||||||
generator,
|
generator,
|
||||||
ctx,
|
ctx,
|
||||||
|_, ctx| {
|
|_, ctx| {
|
||||||
Ok(ctx
|
let not_first = i.compare(ctx, IntPredicate::NE, num_0);
|
||||||
.builder
|
Ok(not_first.value)
|
||||||
.build_int_compare(IntPredicate::ULT, i, last, "")
|
|
||||||
.unwrap())
|
|
||||||
},
|
},
|
||||||
|generator, ctx| {
|
|generator, ctx| {
|
||||||
printf(ctx, generator, ", \0".into(), Vec::default());
|
printf(ctx, generator, ", \0".into(), Vec::default());
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
},
|
},
|
||||||
|_, _| Ok(()),
|
|_, _| Ok(()),
|
||||||
)?;
|
)?;
|
||||||
|
|
||||||
Ok(())
|
// Print element
|
||||||
},
|
polymorphic_print(
|
||||||
llvm_usize.const_int(1, false),
|
ctx,
|
||||||
|
generator,
|
||||||
|
&[(scalar.ty, scalar.value.into())],
|
||||||
|
"",
|
||||||
|
None,
|
||||||
|
true,
|
||||||
|
as_rtio,
|
||||||
)?;
|
)?;
|
||||||
|
Ok(())
|
||||||
|
})?;
|
||||||
|
|
||||||
fmt.push_str(")]");
|
fmt.push_str(")]");
|
||||||
flush(ctx, generator, &mut fmt, &mut args);
|
flush(ctx, generator, &mut fmt, &mut args);
|
||||||
|
|
Loading…
Reference in New Issue