Skip to content

Commit a6c741f

Browse files
committed
Basic examples
1 parent ae64d79 commit a6c741f

File tree

18 files changed

+557
-1
lines changed

18 files changed

+557
-1
lines changed

.gitignore

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,9 @@
11
docs/build
22
docs/.eggs
3+
4+
examples/fpga/*/*/*
5+
!examples/fpga/*/*/build.py
6+
!examples/fpga/*/*/Makefile
7+
examples/target/*/*/*
8+
!examples/target/*/*/io.partial
9+
!examples/target/*/*/Makefile

examples/fpga/Makefile.in

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
PICKLED_CTX := ctx.pickled
2+
3+
.PHONY: all clean
4+
all: $(PICKLED_CTX)
5+
6+
clean:
7+
rm -rf $(PICKLED_CTX) rtl syn vpr
8+
9+
$(PICKLED_CTX): build.py
10+
python $<
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include ../../Makefile.in
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# -*- encoding: ascii -*-
2+
3+
from prga.api.context import *
4+
from prga.api.flow import *
5+
from prga.api.config import *
6+
7+
def run():
8+
context = ArchitectureContext('top', 8, 8, BitchainConfigCircuitryDelegate)
9+
10+
# 1. routing stuff
11+
clk = context.create_global('clk', is_clock = True, bind_to_position = (0, 1))
12+
context.create_segment('L1', 12, 1)
13+
context.create_segment('L2', 4, 2)
14+
15+
# 2. create IOB
16+
iob = context.create_io_block('iob')
17+
while True:
18+
clkport = iob.create_global(clk)
19+
outpad = iob.create_input('outpad', 1)
20+
inpad = iob.create_output('inpad', 1)
21+
ioinst = iob.instances['io']
22+
iff = iob.instantiate(context.primitives['flipflop'], 'iff')
23+
off = iob.instantiate(context.primitives['flipflop'], 'off')
24+
iob.connect(clkport, iff.pins['clk'])
25+
iob.connect(ioinst.pins['inpad'], iff.pins['D'])
26+
iob.connect(iff.pins['Q'], inpad)
27+
iob.connect(ioinst.pins['inpad'], inpad)
28+
iob.connect(clkport, off.pins['clk'])
29+
iob.connect(off.pins['Q'], ioinst.pins['outpad'])
30+
iob.connect(outpad, ioinst.pins['outpad'])
31+
iob.connect(outpad, off.pins['D'])
32+
break
33+
34+
# 3. create tile
35+
iotiles = {}
36+
for orientation in iter(Orientation):
37+
if orientation.is_auto:
38+
continue
39+
iotiles[orientation] = context.create_tile(
40+
'io_tile_{}'.format(orientation.name), iob, 4, orientation)
41+
42+
# 5. create CLB
43+
clb = context.create_logic_block('clb')
44+
while True:
45+
clkport = clb.create_global(clk, Orientation.south)
46+
ceport = clb.create_input('ce', 1, Orientation.south)
47+
srport = clb.create_input('sr', 1, Orientation.south)
48+
cin = clb.create_input('cin', 1, Orientation.north)
49+
for i in range(2):
50+
inst = clb.instantiate(context.primitives['fraclut6sffc'], 'cluster{}'.format(i))
51+
clb.connect(clkport, inst.pins['clk'])
52+
clb.connect(ceport, inst.pins['ce'])
53+
clb.connect(srport, inst.pins['sr'])
54+
clb.connect(clb.create_input('ia' + str(i), 6, Orientation.west), inst.pins['ia'])
55+
clb.connect(clb.create_input('ib' + str(i), 1, Orientation.west), inst.pins['ib'])
56+
clb.connect(cin, inst.pins['cin'], pack_pattern = 'carrychain')
57+
cin = inst.pins['cout']
58+
clb.connect(inst.pins['oa'], clb.create_output('oa' + str(i), 1, Orientation.east))
59+
clb.connect(inst.pins['ob'], clb.create_output('ob' + str(i), 1, Orientation.east))
60+
clb.connect(inst.pins['q'], clb.create_output('q' + str(i), 1, Orientation.east))
61+
clb.connect(cin, clb.create_output('cout', 1, Orientation.south), pack_pattern = 'carrychain')
62+
break
63+
64+
# 6. create direct inter-block tunnels
65+
context.create_direct_tunnel('carrychain', clb.ports['cout'], clb.ports['cin'], (0, 1))
66+
67+
# 7. create tile
68+
clbtile = context.create_tile('clb_tile', clb)
69+
70+
# 8. fill top-level array
71+
for x in range(8):
72+
for y in range(8):
73+
if x == 0:
74+
if y > 0 and y < 7:
75+
context.top.instantiate_element(iotiles[Orientation.west], (x, y))
76+
elif x == 7:
77+
if y > 0 and y < 7:
78+
context.top.instantiate_element(iotiles[Orientation.east], (x, y))
79+
elif y == 0:
80+
context.top.instantiate_element(iotiles[Orientation.south], (x, y))
81+
elif y == 7:
82+
context.top.instantiate_element(iotiles[Orientation.north], (x, y))
83+
else:
84+
context.top.instantiate_element(clbtile, (x, y))
85+
86+
# 9. flow
87+
flow = Flow((
88+
CompleteRoutingBox(BlockFCValue(BlockPortFCValue(0.25), BlockPortFCValue(0.5)),
89+
{'clb': BlockFCValue(BlockPortFCValue(0.25), BlockPortFCValue(0.25),
90+
{'cin': BlockPortFCValue(0), 'cout': BlockPortFCValue(0)})}),
91+
CompleteSwitch(),
92+
CompleteConnection(),
93+
GenerateVerilog('rtl'),
94+
InjectBitchainConfigCircuitry(),
95+
GenerateVPRXML('vpr'),
96+
CompletePhysical(),
97+
ZeroingBRAMWriteEnable(),
98+
ZeroingBlockPins(),
99+
GenerateYosysResources('syn'),
100+
))
101+
102+
# 10. run flow
103+
flow.run(context)
104+
105+
# 11. create a pickled version
106+
context.pickle('ctx.pickled')
107+
108+
if __name__ == '__main__':
109+
run()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include ../../Makefile.in
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
# -*- encoding: ascii -*-
2+
3+
from prga.api.context import *
4+
from prga.api.flow import *
5+
from prga.api.config import *
6+
7+
def run():
8+
context = ArchitectureContext('top', 8, 8, BitchainConfigCircuitryDelegate)
9+
10+
# 1. routing stuff
11+
clk = context.create_global('clk', is_clock = True, bind_to_position = (0, 1))
12+
context.create_segment('L1', 12, 1)
13+
context.create_segment('L2', 4, 2)
14+
15+
# 2. create IOB
16+
iob = context.create_io_block('iob')
17+
while True:
18+
clkport = iob.create_global(clk)
19+
outpad = iob.create_input('outpad', 1)
20+
inpad = iob.create_output('inpad', 1)
21+
ioinst = iob.instances['io']
22+
iff = iob.instantiate(context.primitives['flipflop'], 'iff')
23+
off = iob.instantiate(context.primitives['flipflop'], 'off')
24+
iob.connect(clkport, iff.pins['clk'])
25+
iob.connect(ioinst.pins['inpad'], iff.pins['D'])
26+
iob.connect(iff.pins['Q'], inpad)
27+
iob.connect(ioinst.pins['inpad'], inpad)
28+
iob.connect(clkport, off.pins['clk'])
29+
iob.connect(off.pins['Q'], ioinst.pins['outpad'])
30+
iob.connect(outpad, ioinst.pins['outpad'])
31+
iob.connect(outpad, off.pins['D'])
32+
break
33+
34+
# 3. create tile
35+
iotiles = {}
36+
for orientation in iter(Orientation):
37+
if orientation.is_auto:
38+
continue
39+
iotiles[orientation] = context.create_tile(
40+
'io_tile_{}'.format(orientation.name), iob, 4, orientation)
41+
42+
# 5. create CLB
43+
clb = context.create_logic_block('clb')
44+
while True:
45+
clkport = clb.create_global(clk, Orientation.south)
46+
ceport = clb.create_input('ce', 1, Orientation.south)
47+
srport = clb.create_input('sr', 1, Orientation.south)
48+
cin = clb.create_input('cin', 1, Orientation.north)
49+
for i in range(2):
50+
inst = clb.instantiate(context.primitives['fraclut6sffc'], 'cluster{}'.format(i))
51+
clb.connect(clkport, inst.pins['clk'])
52+
clb.connect(ceport, inst.pins['ce'])
53+
clb.connect(srport, inst.pins['sr'])
54+
clb.connect(clb.create_input('ia' + str(i), 6, Orientation.west), inst.pins['ia'])
55+
clb.connect(clb.create_input('ib' + str(i), 1, Orientation.west), inst.pins['ib'])
56+
clb.connect(cin, inst.pins['cin'], pack_pattern = 'carrychain')
57+
cin = inst.pins['cout']
58+
clb.connect(inst.pins['oa'], clb.create_output('oa' + str(i), 1, Orientation.east))
59+
clb.connect(inst.pins['ob'], clb.create_output('ob' + str(i), 1, Orientation.east))
60+
clb.connect(inst.pins['q'], clb.create_output('q' + str(i), 1, Orientation.east))
61+
clb.connect(cin, clb.create_output('cout', 1, Orientation.south), pack_pattern = 'carrychain')
62+
break
63+
64+
# 6. create direct inter-block tunnels
65+
context.create_direct_tunnel('carrychain', clb.ports['cout'], clb.ports['cin'], (0, 1))
66+
67+
# 7. create tile
68+
clbtile = context.create_tile('clb_tile', clb)
69+
70+
# 8. create BRAM
71+
bram = context.create_logic_block('bram', 1, 2)
72+
while True:
73+
clkport = bram.create_global(clk, Orientation.south, position = (0, 0))
74+
addrport1 = bram.create_input('addr1', 10, Orientation.west, position = (0, 0))
75+
dinport1 = bram.create_input('data1', 8, Orientation.west, position = (0, 0))
76+
weport1 = bram.create_input('we1', 1, Orientation.west, position = (0, 0))
77+
doutport1 = bram.create_output('out1', 8, Orientation.east, position = (0, 0))
78+
addrport2 = bram.create_input('addr2', 10, Orientation.west, position = (0, 1))
79+
dinport2 = bram.create_input('data2', 8, Orientation.west, position = (0, 1))
80+
weport2 = bram.create_input('we2', 1, Orientation.west, position = (0, 1))
81+
doutport2 = bram.create_output('out2', 8, Orientation.east, position = (0, 1))
82+
inst = bram.instantiate(context.primitive_library.get_or_create_memory(10, 8,
83+
dualport = True), 'ram')
84+
bram.auto_connect(inst)
85+
break
86+
87+
# 9. create tile
88+
bramtile = context.create_tile('bram_tile', bram)
89+
90+
# 10. fill top-level array
91+
for x in range(8):
92+
for y in range(8):
93+
if x == 0:
94+
if y > 0 and y < 7:
95+
context.top.instantiate_element(iotiles[Orientation.west], (x, y))
96+
elif x == 7:
97+
if y > 0 and y < 7:
98+
context.top.instantiate_element(iotiles[Orientation.east], (x, y))
99+
elif y == 0:
100+
context.top.instantiate_element(iotiles[Orientation.south], (x, y))
101+
elif y == 7:
102+
context.top.instantiate_element(iotiles[Orientation.north], (x, y))
103+
elif x in (2, 5):
104+
if y % 2 == 1:
105+
context.top.instantiate_element(bramtile, (x, y))
106+
else:
107+
context.top.instantiate_element(clbtile, (x, y))
108+
109+
# 11. flow
110+
flow = Flow((
111+
CompleteRoutingBox(BlockFCValue(BlockPortFCValue(0.25), BlockPortFCValue(0.5)),
112+
{'clb': BlockFCValue(BlockPortFCValue(0.25), BlockPortFCValue(0.25),
113+
{'cin': BlockPortFCValue(0), 'cout': BlockPortFCValue(0)})}),
114+
CompleteSwitch(),
115+
CompleteConnection(),
116+
GenerateVerilog('rtl'),
117+
InjectBitchainConfigCircuitry(),
118+
GenerateVPRXML('vpr'),
119+
CompletePhysical(),
120+
ZeroingBRAMWriteEnable(),
121+
ZeroingBlockPins(),
122+
GenerateYosysResources('syn'),
123+
))
124+
125+
# 11. run flow
126+
flow.run(context)
127+
128+
# 12. create a pickled version
129+
context.pickle('ctx.pickled')
130+
131+
if __name__ == '__main__':
132+
run()
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
include ../../Makefile.in
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
# -*- encoding: ascii -*-
2+
3+
from prga.api.context import *
4+
from prga.api.flow import *
5+
from prga.api.config import *
6+
7+
from itertools import product
8+
9+
def run():
10+
context = ArchitectureContext('top', 8, 8, BitchainConfigCircuitryDelegate)
11+
12+
# 1. routing stuff
13+
clk = context.create_global('clk', is_clock = True, bind_to_position = (0, 1))
14+
context.create_segment('L1', 12, 1)
15+
16+
# 2. create IOB
17+
iob = context.create_io_block('iob')
18+
while True:
19+
outpad = iob.create_input('outpad', 1)
20+
inpad = iob.create_output('inpad', 1)
21+
ioinst = iob.instances['io']
22+
iob.connect(ioinst.pins['inpad'], inpad)
23+
iob.connect(outpad, ioinst.pins['outpad'])
24+
break
25+
26+
# 3. create tile
27+
iotiles = {}
28+
for orientation in iter(Orientation):
29+
if orientation.is_auto:
30+
continue
31+
iotiles[orientation] = context.create_tile(
32+
'io_tile_{}'.format(orientation.name), iob, 4, orientation)
33+
34+
# 4. create cluster
35+
cluster = context.create_cluster('cluster')
36+
while True:
37+
clkport = cluster.create_input('clk', 1)
38+
inport = cluster.create_input('in', 4)
39+
outport = cluster.create_output('out', 1)
40+
lut = cluster.instantiate(context.primitives['lut4'], 'lutinst')
41+
ff = cluster.instantiate(context.primitives['flipflop'], 'ffinst')
42+
cluster.connect(inport, lut.pins['in'])
43+
cluster.connect(lut.pins['out'], outport)
44+
cluster.connect(clkport, ff.pins['clk'])
45+
cluster.connect(lut.pins['out'], ff.pins['D'])
46+
cluster.connect(ff.pins['Q'], outport)
47+
break
48+
49+
# 5. create CLB
50+
clb = context.create_logic_block('clb')
51+
while True:
52+
clkport = clb.create_global(clk, Orientation.south)
53+
inport = clb.create_input('in', 8, Orientation.west)
54+
outport = clb.create_output('out', 2, Orientation.east)
55+
for i in range(2):
56+
clusterinst = clb.instantiate(cluster, 'cluster{}'.format(i))
57+
clb.connect(inport[i*4:(i+1)*4], clusterinst.pins['in'])
58+
clb.connect(clkport, clusterinst.pins['clk'])
59+
clb.connect(clusterinst.pins['out'], outport[i])
60+
break
61+
62+
# 6. create tile
63+
clbtile = context.create_tile('clb_tile', clb)
64+
65+
# 7. fill top-level array
66+
for x, y in product(range(8), range(8)):
67+
if x == 0:
68+
if y > 0 and y < 7:
69+
context.top.instantiate_element(iotiles[Orientation.west], (x, y))
70+
elif x == 7:
71+
if y > 0 and y < 7:
72+
context.top.instantiate_element(iotiles[Orientation.east], (x, y))
73+
elif y == 0:
74+
context.top.instantiate_element(iotiles[Orientation.south], (x, y))
75+
elif y == 7:
76+
context.top.instantiate_element(iotiles[Orientation.north], (x, y))
77+
else:
78+
context.top.instantiate_element(clbtile, (x, y))
79+
80+
# 11. flow
81+
flow = Flow((
82+
CompleteRoutingBox(BlockFCValue(BlockPortFCValue(0.25), BlockPortFCValue(0.5))),
83+
CompleteSwitch(),
84+
CompleteConnection(),
85+
GenerateVerilog('rtl'),
86+
InjectBitchainConfigCircuitry(),
87+
GenerateVPRXML('vpr'),
88+
CompletePhysical(),
89+
ZeroingBlockPins(),
90+
GenerateYosysResources('syn'),
91+
))
92+
93+
# 11. run flow
94+
flow.run(context)
95+
96+
# 12. create a pickled version
97+
context.pickle('ctx.pickled')
98+
99+
if __name__ == '__main__':
100+
run()

0 commit comments

Comments
 (0)