def make_external(pos, direction='o', pin_extrude=1.5, **kwds): if direction == 'o': style = ('', bus_cap) else: style = (bus_cap, '') return bus(pos, poffx(echo.w() - pos - p(pin_extrude, 0)), style=style, **kwds)
functor['concat'] = comp("ccat", size=(4, 4)).right(functor['f1']).aligny( functor['split'].p) prod2split = bus(functor['split'].w(0.5) - p(4, 0), functor['split'].w(0.5)) fig << prod2split fig << bus_text("(u16, u16)").align(prod2split.pos(0.5), prev().s(0.5, 0.2)) for i in range(2): conn = bus(functor['split'].e(i * 2 + 1), functor[f'f{i+1}'].w(0.5) - (2, 0), functor[f'f{i+1}'].w(0.5), routedef='-|') fig << bus_text("u16").align(conn.pos(0), prev().s(-0.4, 0.1)) fig << conn conn = bus(functor[f'f{i+1}'].e(0.5), functor[f'f{i+1}'].e(0.5) + (2, 0), functor['concat'].w(i * 2 + 1), routedef='|-') fig << bus_text("u17").align(conn.pos(1), prev().s(1.4, 0.1)) fig << conn con2cons = bus(functor['concat'].e(0.5), poffx(4)) fig << con2cons fig << bus_text("(u17, u17)").align(con2cons.pos(0.5), prev().s(0.5, 0.2)) fig << functor # render_fig(fig)
shorten=p(0.2, 0.2), line_width=0.3, border_width=0.06, double=True) bus_text = text(font="\\footnotesize", margin=p(0.5, 0.35)) gear = block(size=p(6, 4), nodesep=p(2, 2)) fig['drv'] = gear('drv', size=p(6, 2)) fig['riscv'] = gear('riscv').right(fig['drv'], 3) fig['register_file'] = gear('register_file').below(fig['riscv']) fig << bus(fig['drv'].e(1), fig['riscv'].w(1)) fig << bus_text("instruction").align(fig[-1].pos(0), prev().s()) fig << bus( fig['riscv'].e(1), poffx(7), fig['register_file'].e(3), routedef='|-') fig << bus_text("reg_file_rd_req").align(fig[-1].pos(0), prev().s()) fig << bus( fig['riscv'].e(3), poffx(5), fig['register_file'].e(1), routedef='|-') fig << bus_text("reg_file_wr_req").align(fig[-1].pos(0), prev().s()) fig << bus( fig['register_file'].w(0.5), poffx(-3), fig['riscv'].w(3), routedef='|-') fig << bus_text("reg_rd_data").align(fig[-1].pos(1.0), prev().s(1.1)) fig << text( r"\textasciitilde", font="\\Huge").align(fig[-1].s(0.54), prev().n(0.5)) fig << text( r"\textasciitilde", font="\\Huge").align(fig[-2].s(0.54),
functor = part("stereo_echo") functor['split'] = comp("Split", size=(4, 6)) functor['f1'] = comp("echo", size=(4, 4)).right(functor['split']).aligny( functor['split'].w(2), prev().s(0)) functor['f2'] = comp("echo", size=(4, 4)).below(functor['f1']) functor['concat'] = comp("Concat", size=(4, 6)).right(functor['f1']).aligny( functor['split'].p) producer = comp("Producer").left(functor['split'], 1).aligny(functor['split'].e(0.5), prev().e(0.5)) prod2split = bus(functor['split'].w(0.5), poffx(-6), style=(bus_cap, None)) fig << prod2split fig << bus_text("(i16, i16)").align(prod2split.pos(0.9), prev().s(0, 0.2)) for i in range(2): conn = bus(functor['split'].e(i * 4 + 1), functor[f'f{i+1}'].w(0.5) - (2, 0), functor[f'f{i+1}'].w(0.5), routedef='-|') fig << bus_text("i16").align(conn.pos(0), prev().s(-0.4, 0.1)) fig << conn conn = bus(functor[f'f{i+1}'].e(0.5), functor[f'f{i+1}'].e(0.5) + (2, 0), functor['concat'].w(i * 4 + 1), routedef='|-')
shorten=p(0.2, 0.2), routedef='|-') echo['prefill'] = block("prefill", size=p(5, 4)).left(echo['decouple'], 2) echo += bus(echo['decouple'].w(0.5), echo['prefill'].e(0.5)) echo['mul'] = mul_block().align(echo['prefill'].w(0.5) - p(4, 0), cur().e(0.5)) echo += bus(echo['prefill'].w(0.5), echo['mul'].e(0.5)) echo += bus_text("feedback").align(echo[-1].pos(0), prev().s(1.0)) echo += bus(echo['mul'].w(0.5), echo['add'].s(0.5), routedef='-|') echo += bus(echo['mul'].s(0.5), poffy(2), poffx(-6.5), routedef='-|', style=(bus_cap, None)) echo += bus_text("feedback_gain").align(echo[-1].pos(1), prev().s()) fig << make_external(echo['add'].w(0.5), direction='i') fig << bus_text("samples").aligny(echo['add'].w(0.5), prev().s()).alignx(echo.w(), prev().s()) fig << echo fig << bus(echo['add'].e(0.5), echo['decouple'].n(1.0) + p(4.5, -2)) fig << bus_text("dout").aligny(fig[-1][1], prev().s()).alignx(echo.e(),