7 if isinstance(txt
, str):
12 line
= line
.split('\n')
17 res
.append(indent
+ line
)
24 def __init__(self
, name
):
27 def extifdecl(self
, name
, count
):
28 sname
= self
.get_iname(count
)
29 return "interface PeripheralSide%s %s;" % (name
.upper(), sname
)
31 def has_axi_master(self
):
37 def mk_dma_irq(self
, name
, count
):
38 if not self
.irq_name():
40 sname
= self
.get_iname(count
)
41 return "{0}_interrupt".format(sname
)
43 def mk_dma_rule(self
, name
, count
):
44 irqname
= self
.mk_dma_irq(name
, count
)
47 pirqname
= self
.irq_name().format(count
)
48 template
= " {0}.send(\n" + \
49 " slow_peripherals.{1});"
50 return template
.format(irqname
, pirqname
)
52 def get_clock_reset(self
, name
, count
):
53 return "slow_clock,slow_reset"
55 def mk_dma_sync(self
, name
, count
):
56 irqname
= self
.mk_dma_irq(name
, count
)
59 sname
= self
.peripheral
.iname().format(count
)
60 template
= "SyncBitIfc#(Bit#(1)) {0} <-\n" + \
61 " <-mkSyncBitToCC({1});"
62 return template
.format(irqname
, self
.get_clock_reset(name
, count
))
64 def mk_dma_connect(self
, name
, count
):
65 irqname
= self
.mk_dma_irq(name
, count
)
68 return "{0}.read".format(irqname
)
70 def fastifdecl(self
, name
, count
):
73 def slowifdeclmux(self
, name
, count
):
79 def num_axi_regs32(self
):
85 def get_iname(self
, inum
):
86 return "{0}{1}".format(self
.name
, self
.mksuffix(self
.name
, inum
))
88 def axibase(self
, name
, ifacenum
):
90 return "%(name)s%(ifacenum)dBase" % locals()
92 def axiend(self
, name
, ifacenum
):
94 return "%(name)s%(ifacenum)dEnd" % locals()
96 def axi_reg_def(self
, start
, name
, ifacenum
):
98 offs
= self
.num_axi_regs32() * 4 * 16
101 end
= start
+ offs
- 1
102 bname
= self
.axibase(name
, ifacenum
)
103 bend
= self
.axiend(name
, ifacenum
)
104 comment
= "%d 32-bit regs" % self
.num_axi_regs32()
105 return (" `define %(bname)s 'h%(start)08X\n"
106 " `define %(bend)s 'h%(end)08X // %(comment)s" % locals(),
109 def axi_master_name(self
, name
, ifacenum
, typ
=''):
111 return "{0}{1}_master_num".format(name
, ifacenum
)
113 def axi_slave_name(self
, name
, ifacenum
, typ
=''):
115 return "{0}{1}_{2}slave_num".format(name
, ifacenum
, typ
)
117 def axi_master_idx(self
, idx
, name
, ifacenum
, typ
):
118 name
= self
.axi_master_name(name
, ifacenum
, typ
)
119 return ("typedef {0} {1};".format(idx
, name
), 1)
121 def axi_slave_idx(self
, idx
, name
, ifacenum
, typ
):
122 name
= self
.axi_slave_name(name
, ifacenum
, typ
)
123 return ("typedef {0} {1};".format(idx
, name
), 1)
125 def axi_fastaddr_map(self
, name
, ifacenum
):
126 return self
.axi_addr_map(name
, ifacenum
, 'fast')
128 def axi_addr_map(self
, name
, ifacenum
, typ
=""):
129 bname
= self
.axibase(name
, ifacenum
)
130 bend
= self
.axiend(name
, ifacenum
)
131 name
= self
.axi_slave_name(name
, ifacenum
, typ
)
133 if(addr>=`{0} && addr<=`{1})
134 return tuple2(True,fromInteger(valueOf({2})));
136 return template
.format(bname
, bend
, name
)
138 def _mk_pincon(self
, name
, count
, ptyp
):
139 # TODO: really should be using bsv.interface_decl.Interfaces
140 # pin-naming rules.... logic here is hard-coded to duplicate
141 # it (see Interface.__init__ outen)
143 for p
in self
.peripheral
.pinspecs
:
146 #n = "{0}{1}".format(self.name, self.mksuffix(name, count))
147 n
= name
# "{0}{1}".format(self.name, self.mksuffix(name, count))
148 ret
.append("//%s %s" % (n
, str(p
)))
150 sname
= self
.get_iname(count
)
151 sname
= "{0}.{1}".format(sname
, pname
)
152 ps
= "slow_peripherals.%s" % sname
154 sname
= self
.peripheral
.iname().format(count
)
155 sname
= "{0}.{1}".format(sname
, pname
)
156 ps
= "pinmux.peripheral_side.%s" % sname
157 if typ
== 'out' or typ
== 'inout':
158 fname
= self
.pinname_out(pname
)
159 if not n
.startswith('gpio'): # XXX EURGH! horrible hack
160 n_
= "{0}{1}".format(n
, count
)
168 cn
= self
._mk
_actual
_connection
('out', name
,
170 pname
, ps_
, n_
, fname
)
174 fname
= self
.pinname_outen(pname
)
176 if isinstance(fname
, str):
177 fname
= "{0}.{1}".format(n_
, fname
)
178 fname
= self
.pinname_tweak(pname
, 'outen', fname
)
179 cn
= self
._mk
_actual
_connection
('outen', name
,
183 if typ
== 'in' or typ
== 'inout':
184 fname
= self
.pinname_in(pname
)
190 n_
= "{0}{1}".format(n
, count
)
191 n_
= '{0}.{1}'.format(n_
, fname
)
192 n_
= self
.ifname_tweak(pname
, 'in', n_
)
193 cn
= self
._mk
_actual
_connection
('in', name
,
195 pname
, ps_
, n_
, fname
)
197 return '\n'.join(ret
)
199 def _mk_actual_connection(self
, ctype
, name
, count
, typ
,
200 pname
, ps
, n
, fname
):
202 ck
= self
.get_clock_reset(name
, count
)
204 if ck
== PBase
.get_clock_reset(self
, name
, count
):
205 ret
.append("mkConnection({0},\n\t\t\t{1}.{2});"
206 .format(ps
, n
, fname
))
208 n2
= "{0}{1}".format(name
, count
)
209 sync
= '{0}_{1}_sync'.format(n2
, pname
)
210 ret
.append("mkConnection({0},\n\t\t\t{1}.get);"
212 ret
.append("mkConnection({0}.put,\n\t\t\t{1}.{2});"
213 .format(sync
, n
, fname
))
214 elif ctype
== 'outen':
215 ret
.append("mkConnection({0}_outen,\n\t\t\t{1});"
218 if ck
== PBase
.get_clock_reset(self
, name
, count
):
219 ret
.append("mkConnection({1},\n\t\t\t{0});".format(
222 n2
= "{0}{1}".format(name
, count
)
223 sync
= '{0}_{1}_sync'.format(n2
, pname
)
224 ret
.append("mkConnection({1}.put,\n\t\t\t{0});".format(
226 ret
.append("mkConnection({1},\n\t\t\t{0}.get);".format(
230 def mk_clk_con(self
, name
, count
):
232 ck
= self
.get_clock_reset(name
, count
)
233 if ck
== PBase
.get_clock_reset(self
, name
, count
):
235 spc
= "sp_clock, sp_reset"
237 Ifc_sync#({0}) {1}_sync <-mksyncconnection(
239 for p
in self
.peripheral
.pinspecs
:
243 if typ
== 'out' or typ
== 'inout':
244 if not n
.startswith('gpio'): # XXX EURGH! horrible hack
245 n_
= "{0}{1}".format(n
, count
)
248 n_
= '{0}_{1}'.format(n_
, pname
)
249 ret
.append(template
.format("Bit#(1)", n_
, ck
, spc
))
250 if typ
== 'in' or typ
== 'inout':
251 #fname = self.pinname_in(pname)
252 n_
= "{0}{1}".format(n
, count
)
253 n_
= '{0}_{1}'.format(n_
, pname
)
254 #n_ = self.ifname_tweak(pname, 'in', n_)
255 ret
.append(template
.format("Bit#(1)", n_
, spc
, ck
))
256 return '\n'.join(ret
)
259 def mk_cellconn(self
, *args
):
262 def mkfast_peripheral(self
, size
=0):
265 def mkslow_peripheral(self
, size
=0):
268 def mksuffix(self
, name
, i
):
271 def __mk_connection(self
, con
, aname
, fabricname
):
272 txt
= "mkConnection ({2}.v_to_slaves\n" + \
273 " [fromInteger(valueOf({1}))],\n" + \
276 print "PBase __mk_connection", self
.name
, aname
279 return txt
.format(con
, aname
, fabricname
)
281 def __mk_master_connection(self
, con
, aname
):
282 txt
= "mkConnection (slow_fabric.v_to_slaves\n" + \
283 " [fromInteger(valueOf({1}))],\n" + \
286 print "PBase __mk_connection", self
.name
, aname
289 return txt
.format(con
, aname
)
291 def mk_connection(self
, count
, fabricname
, typ
, name
=None):
294 print "PBase mk_conn", self
.name
, count
295 aname
= self
.axi_slave_name(name
, count
, typ
)
296 #dname = self.mksuffix(name, count)
297 #dname = "{0}{1}".format(name, dname)
298 con
= self
._mk
_connection
(name
, count
).format(count
, aname
)
299 return self
.__mk
_connection
(con
, aname
, fabricname
)
301 def _mk_connection(self
, name
=None, count
=0):
304 def pinname_out(self
, pname
):
307 def pinname_in(self
, pname
):
310 def pinname_outen(self
, pname
):
313 def ifname_tweak(self
, pname
, typ
, txt
):
316 def pinname_tweak(self
, pname
, typ
, txt
):
322 def mk_plic(self
, inum
, irq_offs
):
324 print "mk_plic", self
.name
, inum
, irq_offs
325 niq
= self
.num_irqs()
327 return ('', irq_offs
)
328 name
= self
.get_iname(inum
)
329 res
.append("// PLIC rules for {0}".format(name
))
330 for idx
in range(niq
):
331 plic_obj
= self
.plic_object(name
, idx
)
332 print "plic_obj", name
, idx
, plic_obj
333 plic
= mkplic_rule
.format(name
, plic_obj
, irq_offs
)
335 irq_offs
+= 1 # increment to next irq
336 return ('\n'.join(res
), irq_offs
)
338 def mk_ext_ifacedef(self
, iname
, inum
):
341 def extfastifinstance(self
, name
, count
):
344 def _extifinstance(self
, name
, count
, suffix
, prefix
, samename
=False,
348 pname
= self
.get_iname(count
)
352 sname
= self
.peripheral
.iname().format(count
)
353 template
= "interface {0}{3} = {2}{1}{4};"
354 return template
.format(pname
, sname
, prefix
, suffix
, ifsuffix
)
356 def extifinstance2(self
, name
, count
):
359 def extifinstance(self
, name
, count
):
360 return self
._extifinstance
(name
, count
, "",
361 "pinmux.peripheral_side.")
365 rule rl_connect_{0}_to_plic_{2};
366 if({1} == 1'b1) begin
367 ff_gateway_queue[{2}].enq(1);
368 plic.ifc_external_irq[{2}].irq_frm_gateway(True);
373 axi_master_declarations
= """\
374 typedef 0 Dmem_master_num;
375 typedef 1 Imem_master_num;
377 typedef TAdd#(LastGen_master_num, `ifdef Debug 1 `else 0 `endif )
379 typedef TAdd#(Debug_master_num, `ifdef DMA 1 `else 0 `endif )
381 typedef TAdd#(DMA_master_num,1)
385 axi_fastslave_declarations
= """\
387 typedef TAdd#(LastGen_fastslave_num,1) Sdram_slave_num;
388 typedef TAdd#(Sdram_slave_num ,`ifdef SDRAM 1 `else 0 `endif )
390 typedef TAdd#(Sdram_cfg_slave_num,`ifdef BOOTROM 1 `else 0 `endif )
392 typedef TAdd#(BootRom_slave_num ,`ifdef Debug 1 `else 0 `endif )
394 typedef TAdd#(Debug_slave_num , `ifdef TCMemory 1 `else 0 `endif )
396 typedef TAdd#(TCM_slave_num ,`ifdef DMA 1 `else 0 `endif )
398 typedef TAdd#(Dma_slave_num ,1 ) SlowPeripheral_slave_num;
399 typedef TAdd#(SlowPeripheral_slave_num,`ifdef VME 1 `else 0 `endif )
401 typedef TAdd#(VME_slave_num,1) Num_Fast_Slaves;
404 axi_slave_declarations
= """\
405 typedef 0 SlowMaster;
407 typedef TAdd#(LastGen_slave_num,`ifdef CLINT 1 `else 0 `endif )
409 typedef TAdd#(CLINT_slave_num ,`ifdef PLIC 1 `else 0 `endif )
411 typedef TAdd#(Plic_slave_num ,`ifdef AXIEXP 1 `else 0 `endif )
413 typedef TAdd#(AxiExp1_slave_num,1) Num_Slow_Slaves;
416 pinmux_cellrule
= """\
417 rule connect_select_lines_pinmux;
423 class CallFn(object):
424 def __init__(self
, peripheral
, name
):
425 self
.peripheral
= peripheral
428 def __call__(self
, *args
):
429 #print "__call__", self.name, self.peripheral.slow, args
430 if not self
.peripheral
.slow
:
432 return getattr(self
.peripheral
.slow
, self
.name
)(*args
[1:])
435 class PeripheralIface(object):
436 def __init__(self
, ifacename
):
438 slow
= slowfactory
.getcls(ifacename
)
439 print "Iface", ifacename
, slow
441 self
.slow
= slow(ifacename
)
442 self
.slow
.peripheral
= self
443 for fname
in ['slowimport',
445 'extifinstance2', 'extifinstance', 'extifdecl',
446 'slowifdecl', 'slowifdeclmux',
449 'mk_dma_sync', 'mk_dma_connect', 'mk_dma_rule',
451 'mk_plic', 'mk_ext_ifacedef',
452 'mk_clk_con', 'mk_ext_ifacedef',
453 'mk_connection', 'mk_cellconn', '_mk_pincon']:
454 fn
= CallFn(self
, fname
)
455 setattr(self
, fname
, types
.MethodType(fn
, self
))
457 #print "PeripheralIface"
460 def mksuffix(self
, name
, i
):
461 if self
.slow
is None:
463 return self
.slow
.mksuffix(name
, i
)
465 def axi_reg_def(self
, start
, count
):
468 return self
.slow
.axi_reg_def(start
, self
.ifacename
, count
)
470 def axi_master_idx(self
, start
, count
, typ
):
471 if not self
.slow
or not self
.slow
.has_axi_master():
473 return self
.slow
.axi_master_idx(start
, self
.ifacename
, count
, typ
)
475 def axi_slave_idx(self
, start
, count
, typ
):
478 return self
.slow
.axi_slave_idx(start
, self
.ifacename
, count
, typ
)
480 def axi_fastaddr_map(self
, count
):
483 return self
.slow
.axi_fastaddr_map(self
.ifacename
, count
)
485 def axi_addr_map(self
, count
):
488 return self
.slow
.axi_addr_map(self
.ifacename
, count
)
491 class PeripheralInterfaces(object):
493 self
.fastbusmode
= False
495 def slowimport(self
, *args
):
497 for (name
, count
) in self
.ifacecount
:
498 #print "slowimport", name, self.data[name].slowimport
499 ret
.append(self
.data
[name
].slowimport())
500 return '\n'.join(li(list(filter(None, ret
)), 4))
502 def extfastifinstance(self
, *args
):
504 for (name
, count
) in self
.ifacecount
:
505 for i
in range(count
):
506 iname
= self
.data
[name
].iname().format(i
)
507 print "extfast", iname
, self
.is_on_fastbus(name
, i
)
508 if self
.is_on_fastbus(name
, i
):
510 ret
.append(self
.data
[name
].extfastifinstance(name
, i
))
511 return '\n'.join(li(list(filter(None, ret
)), 8))
513 def extifinstance2(self
, *args
):
515 for (name
, count
) in self
.ifacecount
:
516 for i
in range(count
):
517 iname
= self
.data
[name
].iname().format(i
)
518 ret
.append(self
.data
[name
].extifinstance2(name
, i
))
519 return '\n'.join(li(list(filter(None, ret
)), 8))
521 def extifinstance(self
, *args
):
523 for (name
, count
) in self
.ifacecount
:
524 for i
in range(count
):
525 iname
= self
.data
[name
].iname().format(i
)
526 if not self
.is_on_fastbus(name
, i
):
528 ret
.append(self
.data
[name
].extifinstance(name
, i
))
529 return '\n'.join(li(list(filter(None, ret
)), 8))
531 def extifdecl(self
, *args
):
533 for (name
, count
) in self
.ifacecount
:
534 for i
in range(count
):
535 if not self
.is_on_fastbus(name
, i
):
537 ret
.append(self
.data
[name
].extifdecl(name
, i
))
538 return '\n'.join(li(list(filter(None, ret
)), 8))
540 def slowifdeclmux(self
, *args
):
542 for (name
, count
) in self
.ifacecount
:
543 for i
in range(count
):
544 ret
.append(self
.data
[name
].slowifdeclmux(name
, i
))
545 return '\n'.join(li(list(filter(None, ret
)), 8))
547 def fastifdecl(self
, *args
):
549 for (name
, count
) in self
.ifacecount
:
550 for i
in range(count
):
551 print "fastifdecl", name
, i
, self
.is_on_fastbus(name
, i
)
552 if self
.is_on_fastbus(name
, i
):
554 ret
.append(self
.data
[name
].fastifdecl(name
, i
))
555 return '\n'.join(li(list(filter(None, ret
)), 4))
557 def slowifdecl(self
, *args
):
559 for (name
, count
) in self
.ifacecount
:
560 for i
in range(count
):
561 if self
.is_on_fastbus(name
, i
):
563 ret
.append(self
.data
[name
].slowifdecl().format(i
, name
))
564 return '\n'.join(list(filter(None, ret
)))
566 def axi_fastmem_def(self
, *args
):
567 return self
._axi
_reg
_def
(0x50000000, *args
)
569 def axi_reg_def(self
, *args
):
570 return self
._axi
_reg
_def
(0x00011100, *args
)
572 def _axi_reg_def(self
, start
, *args
):
574 for (name
, count
) in self
.ifacecount
:
575 for i
in range(count
):
576 if self
.is_on_fastbus(name
, i
):
578 x
= self
.data
[name
].axi_reg_def(start
, i
)
579 #print ("ifc", name, x)
583 return '\n'.join(list(filter(None, ret
)))
585 def _axi_num_idx(self
, start
, template
, typ
, idxtype
, *args
):
587 for (name
, count
) in self
.ifacecount
:
588 for i
in range(count
):
589 if self
.is_on_fastbus(name
, i
):
592 fn
= self
.data
[name
].axi_master_idx
594 fn
= self
.data
[name
].axi_slave_idx
595 (rdef
, offs
) = fn(start
, i
, idxtype
)
596 #print ("ifc", name, rdef, offs)
599 ret
.append("typedef %d LastGen_%s_num;" % (start
- 1, typ
))
600 decls
= '\n'.join(list(filter(None, ret
)))
601 return template
.format(decls
)
603 def axi_slave_idx(self
, *args
):
604 return self
._axi
_num
_idx
(0, axi_slave_declarations
, 'slave',
607 def axi_fastslave_idx(self
, *args
):
608 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
611 def axi_master_idx(self
, *args
):
612 return self
._axi
_num
_idx
(2, axi_master_declarations
, 'master',
615 def axi_fastslave_idx(self
, *args
):
616 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
619 def axi_fastaddr_map(self
, *args
):
621 for (name
, count
) in self
.ifacecount
:
622 for i
in range(count
):
623 if self
.is_on_fastbus(name
, i
):
625 ret
.append(self
.data
[name
].axi_fastaddr_map(i
))
626 return '\n'.join(li(list(filter(None, ret
)), 8))
628 def axi_addr_map(self
, *args
):
630 for (name
, count
) in self
.ifacecount
:
631 for i
in range(count
):
632 if self
.is_on_fastbus(name
, i
):
634 ret
.append(self
.data
[name
].axi_addr_map(i
))
635 return '\n'.join(li(list(filter(None, ret
)), 8))
637 def mkfast_peripheral(self
, *args
):
639 for (name
, count
) in self
.ifacecount
:
640 for i
in range(count
):
641 if self
.is_on_fastbus(name
, i
):
643 #print "mkfast", name, count
644 x
= self
.data
[name
].mkfast_peripheral()
646 suffix
= self
.data
[name
].mksuffix(name
, i
)
647 ret
.append(x
.format(suffix
))
648 return '\n'.join(li(list(filter(None, ret
)), 8))
650 def mkslow_peripheral(self
, *args
):
652 for (name
, count
) in self
.ifacecount
:
653 for i
in range(count
):
654 if self
.is_on_fastbus(name
, i
):
656 #print "mkslow", name, count
657 x
= self
.data
[name
].mkslow_peripheral()
659 suffix
= self
.data
[name
].mksuffix(name
, i
)
660 ret
.append(x
.format(suffix
))
661 return '\n'.join(li(list(filter(None, ret
)), 8))
663 def mk_fast_connection(self
, *args
):
665 for (name
, count
) in self
.ifacecount
:
666 for i
in range(count
):
667 if self
.is_on_fastbus(name
, i
):
669 txt
= self
.data
[name
].mk_connection(i
, "fabric", "fast")
672 print self
.data
[name
].mk_connection
674 return '\n'.join(li(list(filter(None, ret
)), 12))
676 def mk_connection(self
, *args
):
678 for (name
, count
) in self
.ifacecount
:
679 for i
in range(count
):
680 if self
.is_on_fastbus(name
, i
):
682 txt
= self
.data
[name
].mk_connection(i
, "slow_fabric", "")
685 print self
.data
[name
].mk_connection
687 return '\n'.join(li(list(filter(None, ret
)), 8))
689 def mk_cellconn(self
):
692 for (name
, count
) in self
.ifacecount
:
693 for i
in range(count
):
694 if self
.is_on_fastbus(name
, i
):
696 res
= self
.data
[name
].mk_cellconn(cellcount
, name
, i
)
699 (txt
, cellcount
) = res
701 ret
= li('\n'.join(list(filter(None, ret
))), 4)
702 return li(pinmux_cellrule
.format(ret
), 4)
705 return self
._mk
_pincon
("slow")
707 def mk_fast_pincon(self
):
708 return self
._mk
_pincon
("fast")
710 def _mk_pincon(self
, typ
):
712 for (name
, count
) in self
.ifacecount
:
713 for i
in range(count
):
714 if self
.is_on_fastbus(name
, i
):
716 txt
= self
.data
[name
]._mk
_pincon
(name
, i
, typ
)
718 return '\n'.join(li(list(filter(None, ret
)), 4))
720 def mk_dma_irq(self
):
728 for (name
, count
) in self
.ifacecount
:
730 for i
in range(count
):
731 if not self
.is_on_fastbus(name
, i
):
733 txt
= self
.data
[name
].mk_dma_sync(name
, i
)
737 txt
= self
.data
[name
].mk_dma_rule(name
, i
)
738 ifacerules
.append(txt
)
739 txt
= self
.data
[name
].mk_dma_connect(name
, i
)
741 ifacerules
= list(filter(None, ifacerules
))
743 txt
= "rule synchronize_%s_interrupts;" % name
746 rules
.append("endrule")
748 cnct
= list(filter(None, cnct
))
750 _cnct
= ["rule rl_connect_interrupt_to_DMA;",
751 " Bit #(%d) lv_interrupt_to_DMA={" % ct
]
754 cnct
= _cnct
+ [spc
+ spcsep
.join(cnct
)]
756 cnct
.append(" dma.interrupt_from_peripherals(\n" +
757 " lv_interrupt_to_DMA);")
758 cnct
.append("endrule;")
760 ret
= list(filter(None, sync
+ rules
+ cnct
))
762 return '\n'.join(ret
)
764 def num_dmachannels(self
):
765 return "`define NUM_DMACHANNELS {0}".format(self
.dma_count
)
767 def mk_ext_ifacedef(self
):
769 for (name
, count
) in self
.ifacecount
:
770 for i
in range(count
):
771 if self
.is_on_fastbus(name
, i
):
773 txt
= self
.data
[name
].mk_ext_ifacedef(name
, i
)
775 return '\n'.join(li(list(filter(None, ret
)), 8))
779 irq_offs
= 8 # XXX: DMA scovers 0-7?
780 for (name
, count
) in self
.ifacecount
:
781 for i
in range(count
):
782 if self
.is_on_fastbus(name
, i
):
784 res
= self
.data
[name
].mk_plic(i
, irq_offs
)
787 (txt
, irq_offs
) = res
789 self
.num_slow_irqs
= irq_offs
790 return '\n'.join(li(list(filter(None, ret
)), 4))
792 def mk_sloirqsdef(self
):
793 return " `define NUM_SLOW_IRQS {0}".format(self
.num_slow_irqs
)
795 def mk_clk_con(self
):
797 for (name
, count
) in self
.ifacecount
:
798 for i
in range(count
):
799 if self
.is_on_fastbus(name
, i
):
801 txt
= self
.data
[name
].mk_clk_con(name
, i
)
803 return '\n'.join(li(list(filter(None, ret
)), 8))
805 def is_on_fastbus(self
, name
, i
):
806 #print "fastbus mode", self.fastbusmode, name, i
807 iname
= self
.data
[name
].iname().format(i
)
809 return iname
not in self
.fastbus
810 return iname
in self
.fastbus
813 class PFactory(object):
814 def getcls(self
, name
):
815 from uart
import uart
816 from quart
import quart
817 from sdmmc
import sdmmc
819 from eint
import eint
820 from rs232
import rs232
822 from eint
import eint
823 from jtag
import jtag
824 from spi
import spi
, mspi
825 from qspi
import qspi
, mqspi
826 from gpio
import gpio
827 from rgbttl
import rgbttl
828 from flexbus
import flexbus
830 for k
, v
in {'uart': uart
,
846 if name
.startswith(k
):
851 slowfactory
= PFactory()
853 if __name__
== '__main__':
857 i
= PeripheralIface('uart')
859 i
= PeripheralIface('gpioa')