1 from bsv
.peripheral_gen
.base
import PBase
7 size
= len(self
.peripheral
.pinspecs
)
8 return "`define NUM_EINTS %d" % size
10 def mkslow_peripheral(self
, size
=0):
11 size
= len(self
.peripheral
.pinspecs
)
12 return "Wire#(Bit#(%d)) wr_interrupt <- mkWire();" % size
14 def axi_slave_name(self
, name
, ifacenum
, typ
=''):
17 def axi_slave_idx(self
, idx
, name
, ifacenum
, typ
):
20 def axi_addr_map(self
, name
, ifacenum
):
23 def ifname_tweak(self
, pname
, typ
, txt
):
26 print "ifnameweak", pname
, typ
, txt
27 return "wr_interrupt[{0}] <= ".format(pname
)
29 def mk_pincon(self
, name
, count
):
30 ret
= [PBase
.mk_pincon(self
, name
, count
)]
31 size
= len(self
.peripheral
.pinspecs
)
32 ret
.append(eint_pincon_template
.format(size
))
33 ret
.append("rule con_%s%d_io_in;" % (name
, count
))
34 ret
.append(" wr_interrupt <= ({")
35 for idx
, p
in enumerate(self
.peripheral
.pinspecs
):
37 sname
= self
.peripheral
.pname(pname
).format(count
)
38 ps
= "pinmux.peripheral_side.eint.%s" % sname
39 comma
= '' if idx
== size
- 1 else ','
40 ret
.append(" {0}{1}".format(ps
, comma
))
47 eint_pincon_template
= '''\
48 // EINT is offset at end of other peripheral interrupts
50 for(Integer i=0;i<{0};i=i+ 1)begin
51 rule connect_int_to_plic(wr_interrupt[i]==1);
52 ff_gateway_queue[i+`NUM_SLOW_IRQS].enq(1);
53 plic.ifc_external_irq[i+`NUM_SLOW_IRQS].irq_frm_gateway(True);