298 result_chan = Wire(Channel(windowed_struct))
299 args = FuncService.get_call_chans(AppID(
"struct_to_window"),
300 arg_type=FourFieldStruct,
304 sending_frame2 = Reg(Bits(1),
305 name=
"sending_frame2",
311 have_struct = Reg(Bits(1),
318 a_reg = Reg(Bits(32),
323 b_reg = Reg(Bits(32),
328 c_reg = Reg(Bits(32),
333 d_reg = Reg(Bits(32),
340 ready = Wire(Bits(1))
341 struct_data, struct_valid = args.unwrap(ready)
344 lowered_type = windowed_struct.lowered_type
347 frame1_struct = lowered_type.frame1({
"a": a_reg,
"b": b_reg})
348 frame2_struct = lowered_type.frame2({
"c": c_reg,
"d": d_reg})
351 frame1_union = lowered_type((
"frame1", frame1_struct))
352 frame2_union = lowered_type((
"frame2", frame2_struct))
355 output_union = Mux(sending_frame2, frame1_union, frame2_union)
356 output_window = windowed_struct.wrap(output_union)
359 output_valid = have_struct
360 result_internal, result_ready = Channel(windowed_struct).
wrap(
361 output_window, output_valid)
364 frame_sent = output_valid & result_ready
365 store_struct = struct_valid & ~have_struct
366 done_sending = frame_sent & sending_frame2
369 a_reg.assign(Mux(store_struct, a_reg, struct_data[
"a"]))
370 b_reg.assign(Mux(store_struct, b_reg, struct_data[
"b"]))
371 c_reg.assign(Mux(store_struct, c_reg, struct_data[
"c"]))
372 d_reg.assign(Mux(store_struct, d_reg, struct_data[
"d"]))
376 Mux(store_struct, Mux(done_sending, have_struct,
381 sending_frame2.assign(
382 Mux(frame_sent & ~sending_frame2,
383 Mux(done_sending, sending_frame2,
388 ready.assign(~have_struct)
389 result_chan.assign(result_internal)