301 result_chan = Wire(Channel(windowed_struct))
302 args = FuncService.get_call_chans(AppID(
"struct_to_window"),
303 arg_type=FourFieldStruct,
307 sending_frame2 = Reg(Bits(1),
308 name=
"sending_frame2",
314 have_struct = Reg(Bits(1),
321 a_reg = Reg(Bits(32),
326 b_reg = Reg(Bits(32),
331 c_reg = Reg(Bits(32),
336 d_reg = Reg(Bits(32),
343 ready = Wire(Bits(1))
344 struct_data, struct_valid = args.unwrap(ready)
347 lowered_type = windowed_struct.lowered_type
350 frame1_struct = lowered_type.frame1({
"a": a_reg,
"b": b_reg})
351 frame2_struct = lowered_type.frame2({
"c": c_reg,
"d": d_reg})
354 frame1_union = lowered_type((
"frame1", frame1_struct))
355 frame2_union = lowered_type((
"frame2", frame2_struct))
358 output_union = Mux(sending_frame2, frame1_union, frame2_union)
359 output_window = windowed_struct.wrap(output_union)
362 output_valid = have_struct
363 result_internal, result_ready = Channel(windowed_struct).
wrap(
364 output_window, output_valid)
367 frame_sent = output_valid & result_ready
368 store_struct = struct_valid & ~have_struct
369 done_sending = frame_sent & sending_frame2
372 a_reg.assign(Mux(store_struct, a_reg, struct_data[
"a"]))
373 b_reg.assign(Mux(store_struct, b_reg, struct_data[
"b"]))
374 c_reg.assign(Mux(store_struct, c_reg, struct_data[
"c"]))
375 d_reg.assign(Mux(store_struct, d_reg, struct_data[
"d"]))
379 Mux(store_struct, Mux(done_sending, have_struct,
384 sending_frame2.assign(
385 Mux(frame_sent & ~sending_frame2,
386 Mux(done_sending, sending_frame2,
391 ready.assign(~have_struct)
392 result_chan.assign(result_internal)