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}_interrupt.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
):
203 ret
.append("mkConnection({0},\n\t\t\t{1}.{2});"
204 .format(ps
, n
, fname
))
205 elif ctype
== 'outen':
206 ret
.append("mkConnection({0}_outen,\n\t\t\t{1});"
209 ck
= self
.get_clock_reset(name
, count
)
210 if ck
== PBase
.get_clock_reset(self
, name
, count
):
211 ret
.append("mkConnection({1},\n\t\t\t{0});".format(
214 n2
= "{0}{1}".format(name
, count
)
215 sync
= '{0}_{1}_sync'.format(n2
, pname
)
216 ret
.append("mkConnection({1}.put,\n\t\t\t{0});".format(
218 ret
.append("mkConnection({1},\n\t\t\t{0}.get);".format(
222 def mk_clk_con(self
, name
, count
):
224 ck
= self
.get_clock_reset(name
, count
)
225 if ck
== PBase
.get_clock_reset(self
, name
, count
):
227 spc
= "sp_clock, sp_reset"
229 Ifc_sync#({0}) {1}_sync <-mksyncconnection(
231 for p
in self
.peripheral
.pinspecs
:
235 if typ
== 'in' or typ
== 'inout':
236 #fname = self.pinname_in(pname)
237 n_
= "{0}{1}".format(n
, count
)
238 n_
= '{0}_{1}'.format(n_
, pname
)
239 #n_ = self.ifname_tweak(pname, 'in', n_)
240 ret
.append(template
.format("Bit#(1)", n_
, spc
, ck
))
241 return '\n'.join(ret
)
244 def mk_cellconn(self
, *args
):
247 def mkfast_peripheral(self
, size
=0):
250 def mkslow_peripheral(self
, size
=0):
253 def mksuffix(self
, name
, i
):
256 def __mk_connection(self
, con
, aname
, fabricname
):
257 txt
= "mkConnection ({2}.v_to_slaves\n" + \
258 " [fromInteger(valueOf({1}))],\n" + \
261 print "PBase __mk_connection", self
.name
, aname
264 return txt
.format(con
, aname
, fabricname
)
266 def __mk_master_connection(self
, con
, aname
):
267 txt
= "mkConnection (slow_fabric.v_to_slaves\n" + \
268 " [fromInteger(valueOf({1}))],\n" + \
271 print "PBase __mk_connection", self
.name
, aname
274 return txt
.format(con
, aname
)
276 def mk_connection(self
, count
, fabricname
, typ
, name
=None):
279 print "PBase mk_conn", self
.name
, count
280 aname
= self
.axi_slave_name(name
, count
, typ
)
281 #dname = self.mksuffix(name, count)
282 #dname = "{0}{1}".format(name, dname)
283 con
= self
._mk
_connection
(name
, count
).format(count
, aname
)
284 return self
.__mk
_connection
(con
, aname
, fabricname
)
286 def _mk_connection(self
, name
=None, count
=0):
289 def pinname_out(self
, pname
):
292 def pinname_in(self
, pname
):
295 def pinname_outen(self
, pname
):
298 def ifname_tweak(self
, pname
, typ
, txt
):
301 def pinname_tweak(self
, pname
, typ
, txt
):
307 def mk_plic(self
, inum
, irq_offs
):
309 print "mk_plic", self
.name
, inum
, irq_offs
310 niq
= self
.num_irqs()
312 return ('', irq_offs
)
313 name
= self
.get_iname(inum
)
314 res
.append("// PLIC rules for {0}".format(name
))
315 for idx
in range(niq
):
316 plic_obj
= self
.plic_object(name
, idx
)
317 print "plic_obj", name
, idx
, plic_obj
318 plic
= mkplic_rule
.format(name
, plic_obj
, irq_offs
)
320 irq_offs
+= 1 # increment to next irq
321 return ('\n'.join(res
), irq_offs
)
323 def mk_ext_ifacedef(self
, iname
, inum
):
326 def extfastifinstance(self
, name
, count
):
329 def _extifinstance(self
, name
, count
, suffix
, prefix
, samename
=False,
333 pname
= self
.get_iname(count
)
337 sname
= self
.peripheral
.iname().format(count
)
338 template
= "interface {0}{3} = {2}{1}{4};"
339 return template
.format(pname
, sname
, prefix
, suffix
, ifsuffix
)
341 def extifinstance2(self
, name
, count
):
344 def extifinstance(self
, name
, count
):
345 return self
._extifinstance
(name
, count
, "",
346 "pinmux.peripheral_side.")
350 rule rl_connect_{0}_to_plic_{2};
351 if({1} == 1'b1) begin
352 ff_gateway_queue[{2}].enq(1);
353 plic.ifc_external_irq[{2}].irq_frm_gateway(True);
358 axi_master_declarations
= """\
359 typedef 0 Dmem_master_num;
360 typedef 1 Imem_master_num;
362 typedef TAdd#(LastGen_master_num, `ifdef Debug 1 `else 0 `endif )
364 typedef TAdd#(Debug_master_num, `ifdef DMA 1 `else 0 `endif )
366 typedef TAdd#(DMA_master_num,1)
370 axi_fastslave_declarations
= """\
372 typedef TAdd#(LastGen_fastslave_num,1) Sdram_slave_num;
373 typedef TAdd#(Sdram_slave_num ,`ifdef SDRAM 1 `else 0 `endif )
375 typedef TAdd#(Sdram_cfg_slave_num,`ifdef BOOTROM 1 `else 0 `endif )
377 typedef TAdd#(BootRom_slave_num ,`ifdef Debug 1 `else 0 `endif )
379 typedef TAdd#(Debug_slave_num , `ifdef TCMemory 1 `else 0 `endif )
381 typedef TAdd#(TCM_slave_num ,`ifdef DMA 1 `else 0 `endif )
383 typedef TAdd#(Dma_slave_num ,1 ) SlowPeripheral_slave_num;
384 typedef TAdd#(SlowPeripheral_slave_num,`ifdef VME 1 `else 0 `endif )
386 typedef TAdd#(VME_slave_num,1) Num_Fast_Slaves;
389 axi_slave_declarations
= """\
390 typedef 0 SlowMaster;
392 typedef TAdd#(LastGen_slave_num,`ifdef CLINT 1 `else 0 `endif )
394 typedef TAdd#(CLINT_slave_num ,`ifdef PLIC 1 `else 0 `endif )
396 typedef TAdd#(Plic_slave_num ,`ifdef AXIEXP 1 `else 0 `endif )
398 typedef TAdd#(AxiExp1_slave_num,1) Num_Slow_Slaves;
401 pinmux_cellrule
= """\
402 rule connect_select_lines_pinmux;
408 class CallFn(object):
409 def __init__(self
, peripheral
, name
):
410 self
.peripheral
= peripheral
413 def __call__(self
, *args
):
414 #print "__call__", self.name, self.peripheral.slow, args
415 if not self
.peripheral
.slow
:
417 return getattr(self
.peripheral
.slow
, self
.name
)(*args
[1:])
420 class PeripheralIface(object):
421 def __init__(self
, ifacename
):
423 slow
= slowfactory
.getcls(ifacename
)
424 print "Iface", ifacename
, slow
426 self
.slow
= slow(ifacename
)
427 self
.slow
.peripheral
= self
428 for fname
in ['slowimport',
430 'extifinstance2', 'extifinstance', 'extifdecl',
431 'slowifdecl', 'slowifdeclmux',
434 'mk_dma_sync', 'mk_dma_connect', 'mk_dma_rule',
436 'mk_plic', 'mk_ext_ifacedef',
437 'mk_clk_con', 'mk_ext_ifacedef',
438 'mk_connection', 'mk_cellconn', '_mk_pincon']:
439 fn
= CallFn(self
, fname
)
440 setattr(self
, fname
, types
.MethodType(fn
, self
))
442 #print "PeripheralIface"
445 def mksuffix(self
, name
, i
):
446 if self
.slow
is None:
448 return self
.slow
.mksuffix(name
, i
)
450 def axi_reg_def(self
, start
, count
):
453 return self
.slow
.axi_reg_def(start
, self
.ifacename
, count
)
455 def axi_master_idx(self
, start
, count
, typ
):
456 if not self
.slow
or not self
.slow
.has_axi_master():
458 return self
.slow
.axi_master_idx(start
, self
.ifacename
, count
, typ
)
460 def axi_slave_idx(self
, start
, count
, typ
):
463 return self
.slow
.axi_slave_idx(start
, self
.ifacename
, count
, typ
)
465 def axi_fastaddr_map(self
, count
):
468 return self
.slow
.axi_fastaddr_map(self
.ifacename
, count
)
470 def axi_addr_map(self
, count
):
473 return self
.slow
.axi_addr_map(self
.ifacename
, count
)
476 class PeripheralInterfaces(object):
478 self
.fastbusmode
= False
480 def slowimport(self
, *args
):
482 for (name
, count
) in self
.ifacecount
:
483 #print "slowimport", name, self.data[name].slowimport
484 ret
.append(self
.data
[name
].slowimport())
485 return '\n'.join(li(list(filter(None, ret
)), 4))
487 def extfastifinstance(self
, *args
):
489 for (name
, count
) in self
.ifacecount
:
490 for i
in range(count
):
491 iname
= self
.data
[name
].iname().format(i
)
492 print "extfast", iname
, self
.is_on_fastbus(name
, i
)
493 if self
.is_on_fastbus(name
, i
):
495 ret
.append(self
.data
[name
].extfastifinstance(name
, i
))
496 return '\n'.join(li(list(filter(None, ret
)), 8))
498 def extifinstance2(self
, *args
):
500 for (name
, count
) in self
.ifacecount
:
501 for i
in range(count
):
502 iname
= self
.data
[name
].iname().format(i
)
503 ret
.append(self
.data
[name
].extifinstance2(name
, i
))
504 return '\n'.join(li(list(filter(None, ret
)), 8))
506 def extifinstance(self
, *args
):
508 for (name
, count
) in self
.ifacecount
:
509 for i
in range(count
):
510 iname
= self
.data
[name
].iname().format(i
)
511 if not self
.is_on_fastbus(name
, i
):
513 ret
.append(self
.data
[name
].extifinstance(name
, i
))
514 return '\n'.join(li(list(filter(None, ret
)), 8))
516 def extifdecl(self
, *args
):
518 for (name
, count
) in self
.ifacecount
:
519 for i
in range(count
):
520 if not self
.is_on_fastbus(name
, i
):
522 ret
.append(self
.data
[name
].extifdecl(name
, i
))
523 return '\n'.join(li(list(filter(None, ret
)), 8))
525 def slowifdeclmux(self
, *args
):
527 for (name
, count
) in self
.ifacecount
:
528 for i
in range(count
):
529 ret
.append(self
.data
[name
].slowifdeclmux(name
, i
))
530 return '\n'.join(li(list(filter(None, ret
)), 8))
532 def fastifdecl(self
, *args
):
534 for (name
, count
) in self
.ifacecount
:
535 for i
in range(count
):
536 print "fastifdecl", name
, i
, self
.is_on_fastbus(name
, i
)
537 if self
.is_on_fastbus(name
, i
):
539 ret
.append(self
.data
[name
].fastifdecl(name
, i
))
540 return '\n'.join(li(list(filter(None, ret
)), 4))
542 def slowifdecl(self
, *args
):
544 for (name
, count
) in self
.ifacecount
:
545 for i
in range(count
):
546 if self
.is_on_fastbus(name
, i
):
548 ret
.append(self
.data
[name
].slowifdecl().format(i
, name
))
549 return '\n'.join(list(filter(None, ret
)))
551 def axi_fastmem_def(self
, *args
):
552 return self
._axi
_reg
_def
(0x50000000, *args
)
554 def axi_reg_def(self
, *args
):
555 return self
._axi
_reg
_def
(0x00011100, *args
)
557 def _axi_reg_def(self
, start
, *args
):
559 for (name
, count
) in self
.ifacecount
:
560 for i
in range(count
):
561 if self
.is_on_fastbus(name
, i
):
563 x
= self
.data
[name
].axi_reg_def(start
, i
)
564 #print ("ifc", name, x)
568 return '\n'.join(list(filter(None, ret
)))
570 def _axi_num_idx(self
, start
, template
, typ
, idxtype
, *args
):
572 for (name
, count
) in self
.ifacecount
:
573 for i
in range(count
):
574 if self
.is_on_fastbus(name
, i
):
577 fn
= self
.data
[name
].axi_master_idx
579 fn
= self
.data
[name
].axi_slave_idx
580 (rdef
, offs
) = fn(start
, i
, idxtype
)
581 #print ("ifc", name, rdef, offs)
584 ret
.append("typedef %d LastGen_%s_num;" % (start
- 1, typ
))
585 decls
= '\n'.join(list(filter(None, ret
)))
586 return template
.format(decls
)
588 def axi_slave_idx(self
, *args
):
589 return self
._axi
_num
_idx
(0, axi_slave_declarations
, 'slave',
592 def axi_fastslave_idx(self
, *args
):
593 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
596 def axi_master_idx(self
, *args
):
597 return self
._axi
_num
_idx
(2, axi_master_declarations
, 'master',
600 def axi_fastslave_idx(self
, *args
):
601 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
604 def axi_fastaddr_map(self
, *args
):
606 for (name
, count
) in self
.ifacecount
:
607 for i
in range(count
):
608 if self
.is_on_fastbus(name
, i
):
610 ret
.append(self
.data
[name
].axi_fastaddr_map(i
))
611 return '\n'.join(li(list(filter(None, ret
)), 8))
613 def axi_addr_map(self
, *args
):
615 for (name
, count
) in self
.ifacecount
:
616 for i
in range(count
):
617 if self
.is_on_fastbus(name
, i
):
619 ret
.append(self
.data
[name
].axi_addr_map(i
))
620 return '\n'.join(li(list(filter(None, ret
)), 8))
622 def mkfast_peripheral(self
, *args
):
624 for (name
, count
) in self
.ifacecount
:
625 for i
in range(count
):
626 if self
.is_on_fastbus(name
, i
):
628 #print "mkfast", name, count
629 x
= self
.data
[name
].mkfast_peripheral()
631 suffix
= self
.data
[name
].mksuffix(name
, i
)
632 ret
.append(x
.format(suffix
))
633 return '\n'.join(li(list(filter(None, ret
)), 8))
635 def mkslow_peripheral(self
, *args
):
637 for (name
, count
) in self
.ifacecount
:
638 for i
in range(count
):
639 if self
.is_on_fastbus(name
, i
):
641 #print "mkslow", name, count
642 x
= self
.data
[name
].mkslow_peripheral()
644 suffix
= self
.data
[name
].mksuffix(name
, i
)
645 ret
.append(x
.format(suffix
))
646 return '\n'.join(li(list(filter(None, ret
)), 8))
648 def mk_fast_connection(self
, *args
):
650 for (name
, count
) in self
.ifacecount
:
651 for i
in range(count
):
652 if self
.is_on_fastbus(name
, i
):
654 txt
= self
.data
[name
].mk_connection(i
, "fabric", "fast")
657 print self
.data
[name
].mk_connection
659 return '\n'.join(li(list(filter(None, ret
)), 12))
661 def mk_connection(self
, *args
):
663 for (name
, count
) in self
.ifacecount
:
664 for i
in range(count
):
665 if self
.is_on_fastbus(name
, i
):
667 txt
= self
.data
[name
].mk_connection(i
, "slow_fabric", "")
670 print self
.data
[name
].mk_connection
672 return '\n'.join(li(list(filter(None, ret
)), 8))
674 def mk_cellconn(self
):
677 for (name
, count
) in self
.ifacecount
:
678 for i
in range(count
):
679 if self
.is_on_fastbus(name
, i
):
681 res
= self
.data
[name
].mk_cellconn(cellcount
, name
, i
)
684 (txt
, cellcount
) = res
686 ret
= li('\n'.join(list(filter(None, ret
))), 4)
687 return li(pinmux_cellrule
.format(ret
), 4)
690 return self
._mk
_pincon
("slow")
692 def mk_fast_pincon(self
):
693 return self
._mk
_pincon
("fast")
695 def _mk_pincon(self
, typ
):
697 for (name
, count
) in self
.ifacecount
:
698 for i
in range(count
):
699 if self
.is_on_fastbus(name
, i
):
701 txt
= self
.data
[name
]._mk
_pincon
(name
, i
, typ
)
703 return '\n'.join(li(list(filter(None, ret
)), 4))
705 def mk_dma_irq(self
):
713 for (name
, count
) in self
.ifacecount
:
715 for i
in range(count
):
716 if not self
.is_on_fastbus(name
, i
):
718 txt
= self
.data
[name
].mk_dma_sync(name
, i
)
722 txt
= self
.data
[name
].mk_dma_rule(name
, i
)
723 ifacerules
.append(txt
)
724 txt
= self
.data
[name
].mk_dma_connect(name
, i
)
726 ifacerules
= list(filter(None, ifacerules
))
728 txt
= "rule synchronize_%s_interrupts;" % name
731 rules
.append("endrule")
733 cnct
= list(filter(None, cnct
))
735 _cnct
= ["rule rl_connect_interrupt_to_DMA;",
736 " Bit #(%d) lv_interrupt_to_DMA={" % ct
]
739 cnct
= _cnct
+ [spc
+ spcsep
.join(cnct
)]
741 cnct
.append(" dma.interrupt_from_peripherals(\n" +
742 " lv_interrupt_to_DMA);")
743 cnct
.append("endrule;")
745 ret
= list(filter(None, sync
+ rules
+ cnct
))
747 return '\n'.join(ret
)
749 def num_dmachannels(self
):
750 return "`define NUM_DMACHANNELS {0}".format(self
.dma_count
)
752 def mk_ext_ifacedef(self
):
754 for (name
, count
) in self
.ifacecount
:
755 for i
in range(count
):
756 if self
.is_on_fastbus(name
, i
):
758 txt
= self
.data
[name
].mk_ext_ifacedef(name
, i
)
760 return '\n'.join(li(list(filter(None, ret
)), 8))
764 irq_offs
= 8 # XXX: DMA scovers 0-7?
765 for (name
, count
) in self
.ifacecount
:
766 for i
in range(count
):
767 if self
.is_on_fastbus(name
, i
):
769 res
= self
.data
[name
].mk_plic(i
, irq_offs
)
772 (txt
, irq_offs
) = res
774 self
.num_slow_irqs
= irq_offs
775 return '\n'.join(li(list(filter(None, ret
)), 4))
777 def mk_sloirqsdef(self
):
778 return " `define NUM_SLOW_IRQS {0}".format(self
.num_slow_irqs
)
780 def mk_clk_con(self
):
782 for (name
, count
) in self
.ifacecount
:
783 for i
in range(count
):
784 if self
.is_on_fastbus(name
, i
):
786 txt
= self
.data
[name
].mk_clk_con(name
, i
)
788 return '\n'.join(li(list(filter(None, ret
)), 8))
790 def is_on_fastbus(self
, name
, i
):
791 #print "fastbus mode", self.fastbusmode, name, i
792 iname
= self
.data
[name
].iname().format(i
)
794 return iname
not in self
.fastbus
795 return iname
in self
.fastbus
798 class PFactory(object):
799 def getcls(self
, name
):
800 from uart
import uart
801 from quart
import quart
802 from sdmmc
import sdmmc
804 from eint
import eint
805 from rs232
import rs232
807 from eint
import eint
808 from jtag
import jtag
809 from spi
import spi
, mspi
810 from qspi
import qspi
, mqspi
811 from gpio
import gpio
812 from rgbttl
import rgbttl
813 from flexbus
import flexbus
815 for k
, v
in {'uart': uart
,
831 if name
.startswith(k
):
836 slowfactory
= PFactory()
838 if __name__
== '__main__':
842 i
= PeripheralIface('uart')
844 i
= PeripheralIface('gpioa')