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_vpincon(self
, name
, count
, ptyp
, typ
, pname
, stype
=None):
203 ret
.append("//%s %s %s %s %s" % (name
, ptyp
, typ
, pname
, stype
))
205 sname
= self
.get_iname(count
)
206 ps
= "slow_peripherals.%s" % sname
208 sname
= self
.peripheral
.iname().format(count
)
209 ps
= "pinmux.peripheral_side.%s" % sname
210 n
= self
.get_iname(count
)
212 n
= "{0}.{1}".format(n
, stype
)
213 ps_
= "{0}.{1}".format(ps
, pname
)
214 ret
+= self
._mk
_actual
_connection
(typ
, name
, count
, typ
,
215 pname
, ps_
, n
, stype
)
216 return '\n'.join(ret
)
218 def _mk_actual_connection(self
, ctype
, name
, count
, typ
,
219 pname
, ps
, n
, fname
):
221 ck
= self
.get_clock_reset(name
, count
)
223 if ck
== PBase
.get_clock_reset(self
, name
, count
):
224 ret
.append("mkConnection({0},\n\t\t\t{1}.{2});"
225 .format(ps
, n
, fname
))
227 n2
= "{0}{1}".format(name
, count
)
228 sync
= '{0}_{1}_sync'.format(n2
, pname
)
229 ret
.append("mkConnection({0},\n\t\t\t{1}.get);"
231 ret
.append("mkConnection({0}.put,\n\t\t\t{1}.{2});"
232 .format(sync
, n
, fname
))
233 elif ctype
== 'outen':
234 ret
.append("mkConnection({0}_outen,\n\t\t\t{1});"
237 if ck
== PBase
.get_clock_reset(self
, name
, count
):
238 ret
.append("mkConnection({1},\n\t\t\t{0});".format(
241 n2
= "{0}{1}".format(name
, count
)
242 sync
= '{0}_{1}_sync'.format(n2
, pname
)
243 ret
.append("mkConnection({1}.put,\n\t\t\t{0});".format(
245 ret
.append("mkConnection({1},\n\t\t\t{0}.get);".format(
250 def _mk_clk_con(self
, name
, count
, ctype
):
252 ck
= self
.get_clock_reset(name
, count
)
253 if ck
== PBase
.get_clock_reset(self
, name
, count
):
256 spc
= self
.get_clk_spc(ctype
)
259 ck
= self
.get_clk_spc(ctype
)
261 Ifc_sync#({0}) {1}_sync <-mksyncconnection(
263 for p
in self
.peripheral
.pinspecs
:
267 if typ
== 'out' or typ
== 'inout':
268 fname
= self
.pinname_out(pname
)
271 if not n
.startswith('gpio'): # XXX EURGH! horrible hack
272 n_
= "{0}{1}".format(n
, count
)
275 n_
= '{0}_{1}'.format(n_
, pname
)
276 ret
.append(template
.format("Bit#(1)", n_
, ck
, spc
))
277 if typ
== 'in' or typ
== 'inout':
278 fname
= self
.pinname_in(pname
)
281 #fname = self.pinname_in(pname)
282 n_
= "{0}{1}".format(n
, count
)
283 n_
= '{0}_{1}'.format(n_
, pname
)
284 #n_ = self.ifname_tweak(pname, 'in', n_)
285 ret
.append(template
.format("Bit#(1)", n_
, spc
, ck
))
286 return '\n'.join(ret
)
288 def get_clk_spc(self
, ctype
):
290 return "sp_clock, sp_reset"
292 return "core_clock, core_reset"
294 def _mk_clk_vcon(self
, name
, count
, ctype
, typ
, pname
, bitspec
):
295 ck
= self
.get_clock_reset(name
, count
)
296 if ck
== PBase
.get_clock_reset(self
, name
, count
):
299 spc
= self
.get_clk_spc(ctype
)
302 ck
= self
.get_clk_spc(ctype
)
304 Ifc_sync#({0}) {1}_sync <-mksyncconnection(
307 n_
= "{0}{1}".format(name
, count
)
308 n_
= '{0}_{1}'.format(n_
, pname
)
309 if typ
== 'in' or typ
== 'inout':
311 return template
.format(bitspec
, n_
, ck
, spc
)
314 def mk_cellconn(self
, *args
):
317 def mkfast_peripheral(self
, size
=0):
320 def mkslow_peripheral(self
, size
=0):
323 def mksuffix(self
, name
, i
):
326 def __mk_connection(self
, con
, aname
, fabricname
):
327 txt
= "mkConnection ({2}.v_to_slaves\n" + \
328 " [fromInteger(valueOf({1}))],\n" + \
331 print "PBase __mk_connection", self
.name
, aname
334 return txt
.format(con
, aname
, fabricname
)
336 def __mk_master_connection(self
, con
, aname
):
337 txt
= "mkConnection (slow_fabric.v_to_slaves\n" + \
338 " [fromInteger(valueOf({1}))],\n" + \
341 print "PBase __mk_connection", self
.name
, aname
344 return txt
.format(con
, aname
)
346 def mk_connection(self
, count
, fabricname
, typ
, name
=None):
349 print "PBase mk_conn", self
.name
, count
350 aname
= self
.axi_slave_name(name
, count
, typ
)
351 #dname = self.mksuffix(name, count)
352 #dname = "{0}{1}".format(name, dname)
353 con
= self
._mk
_connection
(name
, count
).format(count
, aname
)
354 return self
.__mk
_connection
(con
, aname
, fabricname
)
356 def _mk_connection(self
, name
=None, count
=0):
359 def pinname_out(self
, pname
):
362 def pinname_in(self
, pname
):
365 def pinname_outen(self
, pname
):
368 def ifname_tweak(self
, pname
, typ
, txt
):
371 def pinname_tweak(self
, pname
, typ
, txt
):
377 def mk_plic(self
, inum
, irq_offs
):
379 print "mk_plic", self
.name
, inum
, irq_offs
380 niq
= self
.num_irqs()
382 return ('', irq_offs
)
383 name
= self
.get_iname(inum
)
384 res
.append("// PLIC rules for {0}".format(name
))
385 for idx
in range(niq
):
386 plic_obj
= self
.plic_object(name
, idx
)
387 print "plic_obj", name
, idx
, plic_obj
388 plic
= mkplic_rule
.format(name
, plic_obj
, irq_offs
)
390 irq_offs
+= 1 # increment to next irq
391 return ('\n'.join(res
), irq_offs
)
393 def mk_ext_ifacedef(self
, iname
, inum
):
396 def extfastifinstance(self
, name
, count
):
399 def _extifinstance(self
, name
, count
, suffix
, prefix
, samename
=False,
403 pname
= self
.get_iname(count
)
407 sname
= self
.peripheral
.iname().format(count
)
408 template
= "interface {0}{3} = {2}{1}{4};"
409 return template
.format(pname
, sname
, prefix
, suffix
, ifsuffix
)
411 def extifinstance2(self
, name
, count
):
414 def extifinstance(self
, name
, count
):
415 return self
._extifinstance
(name
, count
, "",
416 "pinmux.peripheral_side.")
420 rule rl_connect_{0}_to_plic_{2};
421 if({1} == 1'b1) begin
422 ff_gateway_queue[{2}].enq(1);
423 plic.ifc_external_irq[{2}].irq_frm_gateway(True);
428 axi_master_declarations
= """\
429 typedef 0 Dmem_master_num;
430 typedef 1 Imem_master_num;
432 typedef TAdd#(LastGen_master_num, `ifdef Debug 1 `else 0 `endif )
434 typedef TAdd#(Debug_master_num, `ifdef DMA 1 `else 0 `endif )
436 typedef TAdd#(DMA_master_num,1)
440 axi_fastslave_declarations
= """\
442 typedef TAdd#(LastGen_fastslave_num,1) Sdram_slave_num;
443 typedef TAdd#(Sdram_slave_num ,`ifdef SDRAM 1 `else 0 `endif )
445 typedef TAdd#(Sdram_cfg_slave_num,`ifdef BOOTROM 1 `else 0 `endif )
447 typedef TAdd#(BootRom_slave_num ,`ifdef Debug 1 `else 0 `endif )
449 typedef TAdd#(Debug_slave_num , `ifdef TCMemory 1 `else 0 `endif )
451 typedef TAdd#(TCM_slave_num ,`ifdef DMA 1 `else 0 `endif )
453 typedef TAdd#(Dma_slave_num ,1 ) SlowPeripheral_slave_num;
454 typedef TAdd#(SlowPeripheral_slave_num,`ifdef VME 1 `else 0 `endif )
456 typedef TAdd#(VME_slave_num,1) Num_Fast_Slaves;
459 axi_slave_declarations
= """\
460 typedef 0 SlowMaster;
462 typedef TAdd#(LastGen_slave_num,`ifdef CLINT 1 `else 0 `endif )
464 typedef TAdd#(CLINT_slave_num ,`ifdef PLIC 1 `else 0 `endif )
466 typedef TAdd#(Plic_slave_num ,`ifdef AXIEXP 1 `else 0 `endif )
468 typedef TAdd#(AxiExp1_slave_num,1) Num_Slow_Slaves;
471 pinmux_cellrule
= """\
472 rule connect_select_lines_pinmux;
478 class CallFn(object):
479 def __init__(self
, peripheral
, name
):
480 self
.peripheral
= peripheral
483 def __call__(self
, *args
):
484 #print "__call__", self.name, self.peripheral.slow, args
485 if not self
.peripheral
.slow
:
487 return getattr(self
.peripheral
.slow
, self
.name
)(*args
[1:])
490 class PeripheralIface(object):
491 def __init__(self
, ifacename
):
493 slow
= slowfactory
.getcls(ifacename
)
494 print "Iface", ifacename
, slow
496 self
.slow
= slow(ifacename
)
497 self
.slow
.peripheral
= self
498 for fname
in ['slowimport',
500 'extifinstance2', 'extifinstance', 'extifdecl',
501 'slowifdecl', 'slowifdeclmux',
504 'mk_dma_sync', 'mk_dma_connect', 'mk_dma_rule',
506 'mk_plic', 'mk_ext_ifacedef',
507 '_mk_clk_con', 'mk_ext_ifacedef',
508 'mk_connection', 'mk_cellconn', '_mk_pincon']:
509 fn
= CallFn(self
, fname
)
510 setattr(self
, fname
, types
.MethodType(fn
, self
))
512 #print "PeripheralIface"
515 def mksuffix(self
, name
, i
):
516 if self
.slow
is None:
518 return self
.slow
.mksuffix(name
, i
)
520 def axi_reg_def(self
, start
, count
):
523 return self
.slow
.axi_reg_def(start
, self
.ifacename
, count
)
525 def axi_master_idx(self
, start
, count
, typ
):
526 if not self
.slow
or not self
.slow
.has_axi_master():
528 return self
.slow
.axi_master_idx(start
, self
.ifacename
, count
, typ
)
530 def axi_slave_idx(self
, start
, count
, typ
):
533 return self
.slow
.axi_slave_idx(start
, self
.ifacename
, count
, typ
)
535 def axi_fastaddr_map(self
, count
):
538 return self
.slow
.axi_fastaddr_map(self
.ifacename
, count
)
540 def axi_addr_map(self
, count
):
543 return self
.slow
.axi_addr_map(self
.ifacename
, count
)
546 class PeripheralInterfaces(object):
548 self
.fastbusmode
= False
550 def slowimport(self
, *args
):
552 for (name
, count
) in self
.ifacecount
:
553 #print "slowimport", name, self.data[name].slowimport
554 ret
.append(self
.data
[name
].slowimport())
555 return '\n'.join(li(list(filter(None, ret
)), 4))
557 def extfastifinstance(self
, *args
):
559 for (name
, count
) in self
.ifacecount
:
560 for i
in range(count
):
561 iname
= self
.data
[name
].iname().format(i
)
562 print "extfast", iname
, self
.is_on_fastbus(name
, i
)
563 if self
.is_on_fastbus(name
, i
):
565 ret
.append(self
.data
[name
].extfastifinstance(name
, i
))
566 return '\n'.join(li(list(filter(None, ret
)), 8))
568 def extifinstance2(self
, *args
):
570 for (name
, count
) in self
.ifacecount
:
571 for i
in range(count
):
572 iname
= self
.data
[name
].iname().format(i
)
573 ret
.append(self
.data
[name
].extifinstance2(name
, i
))
574 return '\n'.join(li(list(filter(None, ret
)), 8))
576 def extifinstance(self
, *args
):
578 for (name
, count
) in self
.ifacecount
:
579 for i
in range(count
):
580 iname
= self
.data
[name
].iname().format(i
)
581 if not self
.is_on_fastbus(name
, i
):
583 ret
.append(self
.data
[name
].extifinstance(name
, i
))
584 return '\n'.join(li(list(filter(None, ret
)), 8))
586 def extifdecl(self
, *args
):
588 for (name
, count
) in self
.ifacecount
:
589 for i
in range(count
):
590 if not self
.is_on_fastbus(name
, i
):
592 ret
.append(self
.data
[name
].extifdecl(name
, i
))
593 return '\n'.join(li(list(filter(None, ret
)), 8))
595 def slowifdeclmux(self
, *args
):
597 for (name
, count
) in self
.ifacecount
:
598 for i
in range(count
):
599 ret
.append(self
.data
[name
].slowifdeclmux(name
, i
))
600 return '\n'.join(li(list(filter(None, ret
)), 8))
602 def fastifdecl(self
, *args
):
604 for (name
, count
) in self
.ifacecount
:
605 for i
in range(count
):
606 print "fastifdecl", name
, i
, self
.is_on_fastbus(name
, i
)
607 if self
.is_on_fastbus(name
, i
):
609 ret
.append(self
.data
[name
].fastifdecl(name
, i
))
610 return '\n'.join(li(list(filter(None, ret
)), 4))
612 def slowifdecl(self
, *args
):
614 for (name
, count
) in self
.ifacecount
:
615 for i
in range(count
):
616 if self
.is_on_fastbus(name
, i
):
618 ret
.append(self
.data
[name
].slowifdecl().format(i
, name
))
619 return '\n'.join(list(filter(None, ret
)))
621 def axi_fastmem_def(self
, *args
):
622 return self
._axi
_reg
_def
(0x50000000, *args
)
624 def axi_reg_def(self
, *args
):
625 return self
._axi
_reg
_def
(0x00011100, *args
)
627 def _axi_reg_def(self
, start
, *args
):
629 for (name
, count
) in self
.ifacecount
:
630 for i
in range(count
):
631 if self
.is_on_fastbus(name
, i
):
633 x
= self
.data
[name
].axi_reg_def(start
, i
)
634 #print ("ifc", name, x)
638 return '\n'.join(list(filter(None, ret
)))
640 def _axi_num_idx(self
, start
, template
, typ
, idxtype
, *args
):
642 for (name
, count
) in self
.ifacecount
:
643 for i
in range(count
):
644 if self
.is_on_fastbus(name
, i
):
647 fn
= self
.data
[name
].axi_master_idx
649 fn
= self
.data
[name
].axi_slave_idx
650 (rdef
, offs
) = fn(start
, i
, idxtype
)
651 #print ("ifc", name, rdef, offs)
654 ret
.append("typedef %d LastGen_%s_num;" % (start
- 1, typ
))
655 decls
= '\n'.join(list(filter(None, ret
)))
656 return template
.format(decls
)
658 def axi_slave_idx(self
, *args
):
659 return self
._axi
_num
_idx
(0, axi_slave_declarations
, 'slave',
662 def axi_fastslave_idx(self
, *args
):
663 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
666 def axi_master_idx(self
, *args
):
667 return self
._axi
_num
_idx
(2, axi_master_declarations
, 'master',
670 def axi_fastslave_idx(self
, *args
):
671 return self
._axi
_num
_idx
(0, axi_fastslave_declarations
, 'fastslave',
674 def axi_fastaddr_map(self
, *args
):
676 for (name
, count
) in self
.ifacecount
:
677 for i
in range(count
):
678 if self
.is_on_fastbus(name
, i
):
680 ret
.append(self
.data
[name
].axi_fastaddr_map(i
))
681 return '\n'.join(li(list(filter(None, ret
)), 8))
683 def axi_addr_map(self
, *args
):
685 for (name
, count
) in self
.ifacecount
:
686 for i
in range(count
):
687 if self
.is_on_fastbus(name
, i
):
689 ret
.append(self
.data
[name
].axi_addr_map(i
))
690 return '\n'.join(li(list(filter(None, ret
)), 8))
692 def mkfast_peripheral(self
, *args
):
694 for (name
, count
) in self
.ifacecount
:
695 for i
in range(count
):
696 if self
.is_on_fastbus(name
, i
):
698 #print "mkfast", name, count
699 x
= self
.data
[name
].mkfast_peripheral()
701 suffix
= self
.data
[name
].mksuffix(name
, i
)
702 ret
.append(x
.format(suffix
))
703 return '\n'.join(li(list(filter(None, ret
)), 8))
705 def mkslow_peripheral(self
, *args
):
707 for (name
, count
) in self
.ifacecount
:
708 for i
in range(count
):
709 if self
.is_on_fastbus(name
, i
):
711 #print "mkslow", name, count
712 x
= self
.data
[name
].mkslow_peripheral()
714 suffix
= self
.data
[name
].mksuffix(name
, i
)
715 ret
.append(x
.format(suffix
))
716 return '\n'.join(li(list(filter(None, ret
)), 8))
718 def mk_fast_connection(self
, *args
):
720 for (name
, count
) in self
.ifacecount
:
721 for i
in range(count
):
722 if self
.is_on_fastbus(name
, i
):
724 txt
= self
.data
[name
].mk_connection(i
, "fabric", "fast")
727 print self
.data
[name
].mk_connection
729 return '\n'.join(li(list(filter(None, ret
)), 12))
731 def mk_connection(self
, *args
):
733 for (name
, count
) in self
.ifacecount
:
734 for i
in range(count
):
735 if self
.is_on_fastbus(name
, i
):
737 txt
= self
.data
[name
].mk_connection(i
, "slow_fabric", "")
740 print self
.data
[name
].mk_connection
742 return '\n'.join(li(list(filter(None, ret
)), 8))
744 def mk_cellconn(self
):
747 for (name
, count
) in self
.ifacecount
:
748 for i
in range(count
):
749 if self
.is_on_fastbus(name
, i
):
751 res
= self
.data
[name
].mk_cellconn(cellcount
, name
, i
)
754 (txt
, cellcount
) = res
756 ret
= li('\n'.join(list(filter(None, ret
))), 4)
757 return li(pinmux_cellrule
.format(ret
), 4)
760 return self
._mk
_pincon
("slow")
762 def mk_fast_pincon(self
):
763 return self
._mk
_pincon
("fast")
765 def _mk_pincon(self
, typ
):
767 for (name
, count
) in self
.ifacecount
:
768 for i
in range(count
):
769 if self
.is_on_fastbus(name
, i
):
771 txt
= self
.data
[name
]._mk
_pincon
(name
, i
, typ
)
773 return '\n'.join(li(list(filter(None, ret
)), 4))
775 def mk_dma_irq(self
):
783 for (name
, count
) in self
.ifacecount
:
785 for i
in range(count
):
786 if not self
.is_on_fastbus(name
, i
):
788 txt
= self
.data
[name
].mk_dma_sync(name
, i
)
792 txt
= self
.data
[name
].mk_dma_rule(name
, i
)
793 ifacerules
.append(txt
)
794 txt
= self
.data
[name
].mk_dma_connect(name
, i
)
796 ifacerules
= list(filter(None, ifacerules
))
798 txt
= "rule synchronize_%s_interrupts;" % name
801 rules
.append("endrule")
803 cnct
= list(filter(None, cnct
))
805 _cnct
= ["rule rl_connect_interrupt_to_DMA;",
806 " Bit #(%d) lv_interrupt_to_DMA={" % ct
]
809 cnct
= _cnct
+ [spc
+ spcsep
.join(cnct
)]
811 cnct
.append(" dma.interrupt_from_peripherals(\n" +
812 " lv_interrupt_to_DMA);")
813 cnct
.append("endrule;")
815 ret
= list(filter(None, sync
+ rules
+ cnct
))
817 return '\n'.join(ret
)
819 def num_dmachannels(self
):
820 return "`define NUM_DMACHANNELS {0}".format(self
.dma_count
)
822 def mk_ext_ifacedef(self
):
824 for (name
, count
) in self
.ifacecount
:
825 for i
in range(count
):
826 if self
.is_on_fastbus(name
, i
):
828 txt
= self
.data
[name
].mk_ext_ifacedef(name
, i
)
830 return '\n'.join(li(list(filter(None, ret
)), 8))
834 irq_offs
= 8 # XXX: DMA scovers 0-7?
835 for (name
, count
) in self
.ifacecount
:
836 for i
in range(count
):
837 if self
.is_on_fastbus(name
, i
):
839 res
= self
.data
[name
].mk_plic(i
, irq_offs
)
842 (txt
, irq_offs
) = res
844 self
.num_slow_irqs
= irq_offs
845 return '\n'.join(li(list(filter(None, ret
)), 4))
847 def mk_sloirqsdef(self
):
848 return " `define NUM_SLOW_IRQS {0}".format(self
.num_slow_irqs
)
850 def mk_fastclk_con(self
):
851 return self
._mk
_clk
_con
("fast")
853 def mk_slowclk_con(self
):
854 return self
._mk
_clk
_con
("slow")
856 def _mk_clk_con(self
, ctype
):
858 for (name
, count
) in self
.ifacecount
:
859 for i
in range(count
):
860 if self
.is_on_fastbus(name
, i
):
862 txt
= self
.data
[name
]._mk
_clk
_con
(name
, i
, ctype
)
864 return '\n'.join(li(list(filter(None, ret
)), 8))
866 def is_on_fastbus(self
, name
, i
):
867 #print "fastbus mode", self.fastbusmode, name, i
868 iname
= self
.data
[name
].iname().format(i
)
870 return iname
not in self
.fastbus
871 return iname
in self
.fastbus
874 class PFactory(object):
875 def getcls(self
, name
):
876 from uart
import uart
877 from quart
import quart
878 from sdmmc
import sdmmc
880 from eint
import eint
881 from rs232
import rs232
883 from eint
import eint
884 from jtag
import jtag
885 from spi
import spi
, mspi
886 from qspi
import qspi
, mqspi
887 from gpio
import gpio
888 from rgbttl
import rgbttl
889 from flexbus
import flexbus
891 for k
, v
in {'uart': uart
,
907 if name
.startswith(k
):
912 slowfactory
= PFactory()
914 if __name__
== '__main__':
918 i
= PeripheralIface('uart')
920 i
= PeripheralIface('gpioa')