307 result_chan = Wire(Channel(windowed_struct))
308 args = FuncService.get_call_chans(AppID(
"struct_to_window"),
309 arg_type=FourFieldStruct,
313 sending_frame2 = Reg(Bits(1),
314 name=
"sending_frame2",
320 have_struct = Reg(Bits(1),
327 a_reg = Reg(Bits(32),
332 b_reg = Reg(Bits(32),
337 c_reg = Reg(Bits(32),
342 d_reg = Reg(Bits(32),
349 ready = Wire(Bits(1))
350 struct_data, struct_valid = args.unwrap(ready)
353 lowered_type = windowed_struct.lowered_type
356 frame1_struct = lowered_type.frame1({
"a": a_reg,
"b": b_reg})
357 frame2_struct = lowered_type.frame2({
"c": c_reg,
"d": d_reg})
360 frame1_union = lowered_type((
"frame1", frame1_struct))
361 frame2_union = lowered_type((
"frame2", frame2_struct))
364 output_union = Mux(sending_frame2, frame1_union, frame2_union)
365 output_window = windowed_struct.wrap(output_union)
368 output_valid = have_struct
369 result_internal, result_ready = Channel(windowed_struct).
wrap(
370 output_window, output_valid)
373 frame_sent = output_valid & result_ready
374 store_struct = struct_valid & ~have_struct
375 done_sending = frame_sent & sending_frame2
378 a_reg.assign(Mux(store_struct, a_reg, struct_data[
"a"]))
379 b_reg.assign(Mux(store_struct, b_reg, struct_data[
"b"]))
380 c_reg.assign(Mux(store_struct, c_reg, struct_data[
"c"]))
381 d_reg.assign(Mux(store_struct, d_reg, struct_data[
"d"]))
385 Mux(store_struct, Mux(done_sending, have_struct,
390 sending_frame2.assign(
391 Mux(frame_sent & ~sending_frame2,
392 Mux(done_sending, sending_frame2,
397 ready.assign(~have_struct)
398 result_chan.assign(result_internal)