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
, ctype
):
232 ck
= self
.get_clock_reset(name
, count
)
233 if ck
== PBase
.get_clock_reset(self
, name
, count
):
236 spc
= "sp_clock, sp_reset"
238 spc
= "fast_clock, fast_reset"
240 Ifc_sync#({0}) {1}_sync <-mksyncconnection(
242 for p
in self
.peripheral
.pinspecs
:
246 if typ
== 'out' or typ
== 'inout':
247 fname
= self
.pinname_out(pname
)
250 if not n
.startswith('gpio'): # XXX EURGH! horrible hack
251 n_
= "{0}{1}".format(n
, count
)
254 n_
= '{0}_{1}'.format(n_
, pname
)
255 ret
.append(template
.format("Bit#(1)", n_
, ck
, spc
))
256 if typ
== 'in' or typ
== 'inout':
257 fname
= self
.pinname_in(pname
)
260 #fname = self.pinname_in(pname)
261 n_
= "{0}{1}".format(n
, count
)
262 n_
= '{0}_{1}'.format(n_
, pname
)
263 #n_ = self.ifname_tweak(pname, 'in', n_)
264 ret
.append(template
.format("Bit#(1)", n_
, spc
, ck
))
265 return '\n'.join(ret
)
268 def mk_cellconn(self
, *args
):
271 def mkfast_peripheral(self
, size
=0):
274 def mkslow_peripheral(self
, size
=0):
277 def mksuffix(self
, name
, i
):
280 def __mk_connection(self
, con
, aname
, fabricname
):
281 txt
= "mkConnection ({2}.v_to_slaves\n" + \
282 " [fromInteger(valueOf({1}))],\n" + \
285 print "PBase __mk_connection", self
.name
, aname
288 return txt
.format(con
, aname
, fabricname
)
290 def __mk_master_connection(self
, con
, aname
):
291 txt
= "mkConnection (slow_fabric.v_to_slaves\n" + \
292 " [fromInteger(valueOf({1}))],\n" + \
295 print "PBase __mk_connection", self
.name
, aname
298 return txt
.format(con
, aname
)
300 def mk_connection(self
, count
, fabricname
, typ
, name
=None):
303 print "PBase mk_conn", self
.name
, count
304 aname
= self
.axi_slave_name(name
, count
, typ
)
305 #dname = self.mksuffix(name, count)
306 #dname = "{0}{1}".format(name, dname)
307 con
= self
._mk
_connection
(name
, count
).format(count
, aname
)
308 return self
.__mk
_connection
(con
, aname
, fabricname
)
310 def _mk_connection(self
, name
=None, count
=0):
313 def pinname_out(self
, pname
):
316 def pinname_in(self
, pname
):
319 def pinname_outen(self
, pname
):
322 def ifname_tweak(self
, pname
, typ
, txt
):
325 def pinname_tweak(self
, pname
, typ
, txt
):
331 def mk_plic(self
, inum
, irq_offs
):
333 print "mk_plic", self
.name
, inum
, irq_offs
334 niq
= self
.num_irqs()
336 return ('', irq_offs
)
337 name
= self
.get_iname(inum
)
338 res
.append("// PLIC rules for {0}".format(name
))
339 for idx
in range(niq
):
340 plic_obj
= self
.plic_object(name
, idx
)
341 print "plic_obj", name
, idx
, plic_obj
342 plic
= mkplic_rule
.format(name
, plic_obj
, irq_offs
)
344 irq_offs
+= 1 # increment to next irq
345 return ('\n'.join(res
), irq_offs
)
347 def mk_ext_ifacedef(self
, iname
, inum
):
350 def extfastifinstance(self
, name
, count
):
353 def _extifinstance(self
, name
, count
, suffix
, prefix
, samename
=False,
357 pname
= self
.get_iname(count
)
361 sname
= self
.peripheral
.iname().format(count
)
362 template
= "interface {0}{3} = {2}{1}{4};"
363 return template
.format(pname
, sname
, prefix
, suffix
, ifsuffix
)
365 def extifinstance2(self
, name
, count
):
368 def extifinstance(self
, name
, count
):
369 return self
._extifinstance
(name
, count
, "",
370 "pinmux.peripheral_side.")
374 rule rl_connect_{0}_to_plic_{2};
375 if({1} == 1'b1) begin
376 ff_gateway_queue[{2}].enq(1);
377 plic.ifc_external_irq[{2}].irq_frm_gateway(True);
382 axi_master_declarations
= """\
383 typedef 0 Dmem_master_num;
384 typedef 1 Imem_master_num;
386 typedef TAdd#(LastGen_master_num, `ifdef Debug 1 `else 0 `endif )
388 typedef TAdd#(Debug_master_num, `ifdef DMA 1 `else 0 `endif )
390 typedef TAdd#(DMA_master_num,1)
394 axi_fastslave_declarations
= """\
396 typedef TAdd#(LastGen_fastslave_num,1) Sdram_slave_num;
397 typedef TAdd#(Sdram_slave_num ,`ifdef SDRAM 1 `else 0 `endif )
399 typedef TAdd#(Sdram_cfg_slave_num,`ifdef BOOTROM 1 `else 0 `endif )
401 typedef TAdd#(BootRom_slave_num ,`ifdef Debug 1 `else 0 `endif )
403 typedef TAdd#(Debug_slave_num , `ifdef TCMemory 1 `else 0 `endif )
405 typedef TAdd#(TCM_slave_num ,`ifdef DMA 1 `else 0 `endif )
407 typedef TAdd#(Dma_slave_num ,1 ) SlowPeripheral_slave_num;
408 typedef TAdd#(SlowPeripheral_slave_num,`ifdef VME 1 `else 0 `endif )
410 typedef TAdd#(VME_slave_num,1) Num_Fast_Slaves;
413 axi_slave_declarations
= """\
414 typedef 0 SlowMaster;
416 typedef TAdd#(LastGen_slave_num,`ifdef CLINT 1 `else 0 `endif )
418 typedef TAdd#(CLINT_slave_num ,`ifdef PLIC 1 `else 0 `endif )
420 typedef TAdd#(Plic_slave_num ,`ifdef AXIEXP 1 `else 0 `endif )
422 typedef TAdd#(AxiExp1_slave_num,1) Num_Slow_Slaves;
425 pinmux_cellrule
= """\
426 rule connect_select_lines_pinmux;
432 class CallFn(object):
433 def __init__(self
, peripheral
, name
):
434 self
.peripheral
= peripheral
437 def __call__(self
, *args
):
438 #print "__call__", self.name, self.peripheral.slow, args
439 if not self
.peripheral
.slow
:
441 return getattr(self
.peripheral
.slow
, self
.name
)(*args
[1:])
444 class PeripheralIface(object):
445 def __init__(self
, ifacename
):
447 slow
= slowfactory
.getcls(ifacename
)
448 print "Iface", ifacename
, slow
450 self
.slow
= slow(ifacename
)
451 self
.slow
.peripheral
= self
452 for fname
in ['slowimport',
454 'extifinstance2', 'extifinstance', 'extifdecl',
455 'slowifdecl', 'slowifdeclmux',
458 'mk_dma_sync', 'mk_dma_connect', 'mk_dma_rule',
460 'mk_plic', 'mk_ext_ifacedef',
461 '_mk_clk_con', 'mk_ext_ifacedef',
462 'mk_connection', 'mk_cellconn', '_mk_pincon']:
463 fn
= CallFn(self
, fname
)
464 setattr(self
, fname
, types
.MethodType(fn
, self
))
466 #print "PeripheralIface"
469 def mksuffix(self
, name
, i
):
470 if self
.slow
is None:
472 return self
.slow
.mksuffix(name
, i
)
474 def axi_reg_def(self
, start
, count
):
477 return self
.slow
.axi_reg_def(start
, self
.ifacename
, count
)
479 def axi_master_idx(self
, start
, count
, typ
):
480 if not self
.slow
or not self
.slow
.has_axi_master():
482 return self
.slow
.axi_master_idx(start
, self
.ifacename
, count
, typ
)
484 def axi_slave_idx(self
, start
, count
, typ
):
487 return self
.slow
.axi_slave_idx(start
, self
.ifacename
, count
, typ
)
489 def axi_fastaddr_map(self
, count
):
492 return self
.slow
.axi_fastaddr_map(self
.ifacename
, count
)
494 def axi_addr_map(self
, count
):
497 return self
.slow
.axi_addr_map(self
.ifacename
, count
)
500 class PeripheralInterfaces(object):
502 self
.fastbusmode
= False
504 def slowimport(self
, *args
):
506 for (name
, count
) in self
.ifacecount
:
507 #print "slowimport", name, self.data[name].slowimport
508 ret
.append(self
.data
[name
].slowimport())
509 return '\n'.join(li(list(filter(None, ret
)), 4))
511 def extfastifinstance(self
, *args
):
513 for (name
, count
) in self
.ifacecount
:
514 for i
in range(count
):
515 iname
= self
.data
[name
].iname().format(i
)
516 print "extfast", iname
, self
.is_on_fastbus(name
, i
)
517 if self
.is_on_fastbus(name
, i
):
519 ret
.append(self
.data
[name
].extfastifinstance(name
, i
))
520 return '\n'.join(li(list(filter(None, ret
)), 8))
522 def extifinstance2(self
, *args
):
524 for (name
, count
) in self
.ifacecount
:
525 for i
in range(count
):
526 iname
= self
.data
[name
].iname().format(i
)
527 ret
.append(self
.data
[name
].extifinstance2(name
, i
))
528 return '\n'.join(li(list(filter(None, ret
)), 8))
530 def extifinstance(self
, *args
):
532 for (name
, count
) in self
.ifacecount
:
533 for i
in range(count
):
534 iname
= self
.data
[name
].iname().format(i
)
535 if not self
.is_on_fastbus(name
, i
):
537 ret
.append(self
.data
[name
].extifinstance(name
, i
))
538 return '\n'.join(li(list(filter(None, ret
)), 8))
540 def extifdecl(self
, *args
):
542 for (name
, count
) in self
.ifacecount
:
543 for i
in range(count
):
544 if not self
.is_on_fastbus(name
, i
):
546 ret
.append(self
.data
[name
].extifdecl(name
, i
))
547 return '\n'.join(li(list(filter(None, ret
)), 8))
549 def slowifdeclmux(self
, *args
):
551 for (name
, count
) in self
.ifacecount
:
552 for i
in range(count
):
553 ret
.append(self
.data
[name
].slowifdeclmux(name
, i
))
554 return '\n'.join(li(list(filter(None, ret
)), 8))
556 def fastifdecl(self
, *args
):
558 for (name
, count
) in self
.ifacecount
:
559 for i
in range(count
):
560 print "fastifdecl", name
, i
, self
.is_on_fastbus(name
, i
)
561 if self
.is_on_fastbus(name
, i
):
563 ret
.append(self
.data
[name
].fastifdecl(name
, i
))
564 return '\n'.join(li(list(filter(None, ret
)), 4))
566 def slowifdecl(self
, *args
):
568 for (name
, count
) in self
.ifacecount
:
569 for i
in range(count
):
570 if self
.is_on_fastbus(name
, i
):
572 ret
.append(self
.data
[name
].slowifdecl().format(i
, name
))
573 return '\n'.join(list(filter(None, ret
)))
575 def axi_fastmem_def(self
, *args
):
576 return self
._axi
_reg
_def
(0x50000000, *args
)
578 def axi_reg_def(self
, *args
):
579 return self
._axi
_reg
_def
(0x00011100, *args
)
581 def _axi_reg_def(self
, start
, *args
):
583 for (name
, count
) in self
.ifacecount
:
584 for i
in range(count
):
585 if self
.is_on_fastbus(name
, i
):
587 x
= self
.data
[name
].axi_reg_def(start
, i
)
588 #print ("ifc", name, x)
592 return '\n'.join(list(filter(None, ret
)))
594 def _axi_num_idx(self
, start
, template
, typ
, idxtype
, *args
):
596 for (name
, count
) in self
.ifacecount
:
597 for i
in range(count
):
598 if self
.is_on_fastbus(name
, i
):
601 fn
= self
.data
[name
].axi_master_idx
603 fn
= self
.data
[name
].axi_slave_idx
604 (rdef
, offs
) = fn(start
, i
, idxtype
)
605 #print ("ifc", name, rdef, offs)
608 ret
.append("typedef %d LastGen_%s_num;" % (start
- 1, typ
))
609 decls
= '\n'.join(list(filter(None, ret
)))
610 return template
.format(decls
)
612 def axi_slave_idx(self
, *args
):
613 return self
._axi
_num
_idx
(0, axi_slave_declarations
, 'slave',
616 def axi_fastslave_idx(self
, *args
):
617 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
620 def axi_master_idx(self
, *args
):
621 return self
._axi
_num
_idx
(2, axi_master_declarations
, 'master',
624 def axi_fastslave_idx(self
, *args
):
625 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
628 def axi_fastaddr_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_fastaddr_map(i
))
635 return '\n'.join(li(list(filter(None, ret
)), 8))
637 def axi_addr_map(self
, *args
):
639 for (name
, count
) in self
.ifacecount
:
640 for i
in range(count
):
641 if self
.is_on_fastbus(name
, i
):
643 ret
.append(self
.data
[name
].axi_addr_map(i
))
644 return '\n'.join(li(list(filter(None, ret
)), 8))
646 def mkfast_peripheral(self
, *args
):
648 for (name
, count
) in self
.ifacecount
:
649 for i
in range(count
):
650 if self
.is_on_fastbus(name
, i
):
652 #print "mkfast", name, count
653 x
= self
.data
[name
].mkfast_peripheral()
655 suffix
= self
.data
[name
].mksuffix(name
, i
)
656 ret
.append(x
.format(suffix
))
657 return '\n'.join(li(list(filter(None, ret
)), 8))
659 def mkslow_peripheral(self
, *args
):
661 for (name
, count
) in self
.ifacecount
:
662 for i
in range(count
):
663 if self
.is_on_fastbus(name
, i
):
665 #print "mkslow", name, count
666 x
= self
.data
[name
].mkslow_peripheral()
668 suffix
= self
.data
[name
].mksuffix(name
, i
)
669 ret
.append(x
.format(suffix
))
670 return '\n'.join(li(list(filter(None, ret
)), 8))
672 def mk_fast_connection(self
, *args
):
674 for (name
, count
) in self
.ifacecount
:
675 for i
in range(count
):
676 if self
.is_on_fastbus(name
, i
):
678 txt
= self
.data
[name
].mk_connection(i
, "fabric", "fast")
681 print self
.data
[name
].mk_connection
683 return '\n'.join(li(list(filter(None, ret
)), 12))
685 def mk_connection(self
, *args
):
687 for (name
, count
) in self
.ifacecount
:
688 for i
in range(count
):
689 if self
.is_on_fastbus(name
, i
):
691 txt
= self
.data
[name
].mk_connection(i
, "slow_fabric", "")
694 print self
.data
[name
].mk_connection
696 return '\n'.join(li(list(filter(None, ret
)), 8))
698 def mk_cellconn(self
):
701 for (name
, count
) in self
.ifacecount
:
702 for i
in range(count
):
703 if self
.is_on_fastbus(name
, i
):
705 res
= self
.data
[name
].mk_cellconn(cellcount
, name
, i
)
708 (txt
, cellcount
) = res
710 ret
= li('\n'.join(list(filter(None, ret
))), 4)
711 return li(pinmux_cellrule
.format(ret
), 4)
714 return self
._mk
_pincon
("slow")
716 def mk_fast_pincon(self
):
717 return self
._mk
_pincon
("fast")
719 def _mk_pincon(self
, typ
):
721 for (name
, count
) in self
.ifacecount
:
722 for i
in range(count
):
723 if self
.is_on_fastbus(name
, i
):
725 txt
= self
.data
[name
]._mk
_pincon
(name
, i
, typ
)
727 return '\n'.join(li(list(filter(None, ret
)), 4))
729 def mk_dma_irq(self
):
737 for (name
, count
) in self
.ifacecount
:
739 for i
in range(count
):
740 if not self
.is_on_fastbus(name
, i
):
742 txt
= self
.data
[name
].mk_dma_sync(name
, i
)
746 txt
= self
.data
[name
].mk_dma_rule(name
, i
)
747 ifacerules
.append(txt
)
748 txt
= self
.data
[name
].mk_dma_connect(name
, i
)
750 ifacerules
= list(filter(None, ifacerules
))
752 txt
= "rule synchronize_%s_interrupts;" % name
755 rules
.append("endrule")
757 cnct
= list(filter(None, cnct
))
759 _cnct
= ["rule rl_connect_interrupt_to_DMA;",
760 " Bit #(%d) lv_interrupt_to_DMA={" % ct
]
763 cnct
= _cnct
+ [spc
+ spcsep
.join(cnct
)]
765 cnct
.append(" dma.interrupt_from_peripherals(\n" +
766 " lv_interrupt_to_DMA);")
767 cnct
.append("endrule;")
769 ret
= list(filter(None, sync
+ rules
+ cnct
))
771 return '\n'.join(ret
)
773 def num_dmachannels(self
):
774 return "`define NUM_DMACHANNELS {0}".format(self
.dma_count
)
776 def mk_ext_ifacedef(self
):
778 for (name
, count
) in self
.ifacecount
:
779 for i
in range(count
):
780 if self
.is_on_fastbus(name
, i
):
782 txt
= self
.data
[name
].mk_ext_ifacedef(name
, i
)
784 return '\n'.join(li(list(filter(None, ret
)), 8))
788 irq_offs
= 8 # XXX: DMA scovers 0-7?
789 for (name
, count
) in self
.ifacecount
:
790 for i
in range(count
):
791 if self
.is_on_fastbus(name
, i
):
793 res
= self
.data
[name
].mk_plic(i
, irq_offs
)
796 (txt
, irq_offs
) = res
798 self
.num_slow_irqs
= irq_offs
799 return '\n'.join(li(list(filter(None, ret
)), 4))
801 def mk_sloirqsdef(self
):
802 return " `define NUM_SLOW_IRQS {0}".format(self
.num_slow_irqs
)
804 def mk_fastclk_con(self
):
805 return self
._mk
_clk
_con
("fast")
807 def mk_slowclk_con(self
):
808 return self
._mk
_clk
_con
("slow")
810 def _mk_clk_con(self
, ctype
):
812 for (name
, count
) in self
.ifacecount
:
813 for i
in range(count
):
814 if self
.is_on_fastbus(name
, i
):
816 txt
= self
.data
[name
]._mk
_clk
_con
(name
, i
, ctype
)
818 return '\n'.join(li(list(filter(None, ret
)), 8))
820 def is_on_fastbus(self
, name
, i
):
821 #print "fastbus mode", self.fastbusmode, name, i
822 iname
= self
.data
[name
].iname().format(i
)
824 return iname
not in self
.fastbus
825 return iname
in self
.fastbus
828 class PFactory(object):
829 def getcls(self
, name
):
830 from uart
import uart
831 from quart
import quart
832 from sdmmc
import sdmmc
834 from eint
import eint
835 from rs232
import rs232
837 from eint
import eint
838 from jtag
import jtag
839 from spi
import spi
, mspi
840 from qspi
import qspi
, mqspi
841 from gpio
import gpio
842 from rgbttl
import rgbttl
843 from flexbus
import flexbus
845 for k
, v
in {'uart': uart
,
861 if name
.startswith(k
):
866 slowfactory
= PFactory()
868 if __name__
== '__main__':
872 i
= PeripheralIface('uart')
874 i
= PeripheralIface('gpioa')