source: branches/reconfiguration/platforms/tsar_generic_iob/scripts/arch.py @ 858

Last change on this file since 858 was 858, checked in by cfuguet, 9 years ago

reconf: using a fixed processor's local ID width

  • Modifying the arch.py script to implement a fixed-width for the local processor ID.
  • Property svn:executable set to *
File size: 14.8 KB
Line 
1#!/usr/bin/env python
2"""This file contains a mapping generator for the tsar_generic_iob platform"""
3
4from math import log
5from mapping import Mapping
6
7################################################################################
8#   file   : arch.py  (for the tsar_generic_iob architecture)
9#   date   : may 2014
10#   author : Alain Greiner
11#
12#   modified by:
13#       Cesar Fuguet
14#           - Adding distributed ROMs used by the distributed reconfiguration
15#             procedure
16#
17################################################################################
18#  This platform includes 6 external peripherals, accessible through two
19#  IO_Bridge components located in cluster [0,0] and cluster [x_size-1,
20#  y_size-1]. Available peripherals are: TTY, BDV, FBF, ROM, NIC, CMA.
21#
22#  The "constructor" parameters are:
23#  - x_size         : number of clusters in a row
24#  - y_size         : number of clusters in a column
25#  - nb_procs       : number of processors per cluster
26#  - fbf_width      : frame_buffer width = frame_buffer heigth
27#
28#  The "hidden" parameters (defined below) are:
29#  - NB_TTYS        : number of TTY channels
30#  - NB_NICS        : number of NIC channels
31#  - X_IO           : cluster_io x coordinate
32#  - Y_IO           : cluster_io y coordinate
33#  - X_WIDTH        : number of bits for x coordinate
34#  - Y_WIDTH        : number of bits for y coordinate
35#  - P_WIDTH        : number of bits for processor local id field
36#  - PADDR_WIDTH    : number of bits for physical address
37#  - IRQ_PER_PROC   : number of input IRQs per processor
38#  - USE_RAMDISK    : use a ramdisk when True
39#  - PERI_INCREMENT : virtual address increment for replicated peripherals
40#  - PTAB_INCREMENT : virtual address increment for replicated page tables
41#  - SCHED_INCREMENT: virtual address increment for replicated schedulers
42################################################################################
43
44# define architecture constants
45PADDR_WIDTH = 40
46NB_TTYS = 1
47NB_NICS = 2
48FBF_WIDTH = 128
49X_WIDTH = 4
50Y_WIDTH = 4
51P_WIDTH = 2
52X_IO = 0
53Y_IO = 0
54IRQ_PER_PROC = 4
55USE_RAMDISK = False
56
57# virtual address increment for distributed memory segments in the GietVM OS
58PERI_INCREMENT = 0x10000
59PTAB_INCREMENT = 0x200000
60SCHED_INCREMENT = 0x10000
61
62def pmsb(x, y):
63    """This function returns the physical most signicant bits for the
64    cluster(x,y)"""
65
66    return (x << X_WIDTH) | y
67
68def arch(x_size=2,
69         y_size=2,
70         nb_procs=4,
71         fbf_width=FBF_WIDTH):
72    """This function describes the tsar_generic_iob platform and defines its
73    parameters"""
74
75    # parameters checking
76    assert nb_procs <= 4
77
78    assert ((x_size == 1) or (x_size == 2) or (x_size == 4) or (x_size == 8) or
79            (x_size == 16))
80
81    assert ((y_size == 1) or (y_size == 2) or (y_size == 4) or (y_size == 8) or
82            (y_size == 16))
83
84    assert NB_TTYS == 1
85
86    assert (((X_IO == 0) and (Y_IO == 0)) or
87            ((X_IO == x_size-1) and (Y_IO == y_size-1)))
88
89    platform_name = 'reconf-tsar_iob_%d_%d_%d' % (x_size, y_size, nb_procs)
90
91    # define physical segments
92    ram_base = 0x0000000000
93    if 1:
94        ram_size = 0x4000000              # 64 Mbytes
95    else:
96        ram_size = 0x0040000              # 256 Kbytes
97
98    xcu_base = 0x00B0000000
99    xcu_size = 0x1000                     # 4 Kbytes
100
101    dma_base = 0x00B1000000
102    dma_size = 0x1000 * nb_procs          # 4 Kbytes * nb_procs
103
104    mmc_base = 0x00B2000000
105    mmc_size = 0x1000                     # 4 Kbytes
106
107    rom_base = 0x00BFC00000
108    rom_size = 0x8000                     # 32 Kbytes
109
110    offset_io = pmsb(X_IO, Y_IO) << (PADDR_WIDTH - X_WIDTH - Y_WIDTH)
111
112    bdv_base = 0x00B3000000 + offset_io
113    bdv_size = 0x1000                     # 4 kbytes
114
115    tty_base = 0x00B4000000 + offset_io
116    tty_size = 0x1000                     # 4 Kbytes
117
118    nic_base = 0x00B5000000 + offset_io
119    nic_size = 0x80000                    # 512 kbytes
120
121    cma_base = 0x00B6000000 + offset_io
122    cma_size = 0x1000 * 2 * NB_NICS       # 4 kbytes * 2 * NB_NICS
123
124    fbf_base = 0x00B7000000 + offset_io
125    fbf_size = fbf_width * fbf_width      # fbf_width * fbf_width bytes
126
127    pic_base = 0x00B8000000 + offset_io
128    pic_size = 0x1000                     # 4 Kbytes
129
130    sim_base = 0x00B9000000 + offset_io
131    sim_size = 0x1000                     # 4 kbytes
132
133    iob_base = 0x00BE000000 + offset_io
134    iob_size = 0x1000                     # 4 kbytes
135
136    # create mapping
137    mapping = Mapping(name=platform_name,
138                      x_size=x_size,
139                      y_size=y_size,
140                      nprocs=nb_procs,
141                      x_width=X_WIDTH,
142                      y_width=Y_WIDTH,
143                      p_width=P_WIDTH,
144                      paddr_width=PADDR_WIDTH,
145                      coherence=True,
146                      irq_per_proc=IRQ_PER_PROC,
147                      use_ramdisk=USE_RAMDISK,
148                      x_io=X_IO,
149                      y_io=Y_IO,
150                      peri_increment=PERI_INCREMENT,
151                      ram_base=ram_base,
152                      ram_size=ram_size)
153
154    # external peripherals (accessible in cluster[0,0] only for this mapping)
155    mapping.addPeriph('IOB', base=iob_base, size=iob_size,
156                      ptype='IOB')
157
158    mapping.addPeriph('BDV', base=bdv_base, size=bdv_size,
159                      ptype='IOC', subtype='BDV')
160
161    mapping.addPeriph('TTY', base=tty_base, size=tty_size,
162                      ptype='TTY', channels=NB_TTYS)
163
164    mapping.addPeriph('NIC', base=nic_base, size=nic_size,
165                      ptype='NIC', channels=NB_NICS)
166
167    mapping.addPeriph('CMA', base=cma_base, size=cma_size,
168                      ptype='CMA', channels=2*NB_NICS)
169
170    mapping.addPeriph('FBF', base=fbf_base, size=fbf_size,
171                      ptype='FBF', arg=fbf_width)
172
173    mapping.addPeriph('SIM', base=sim_base, size=sim_size,
174                      ptype='SIM')
175
176    pic = mapping.addPeriph('PIC', base=pic_base, size=pic_size,
177                            ptype='PIC', channels=32)
178
179    mapping.addIrq(pic, index=0, isrtype='ISR_NIC_RX', channel=0)
180    mapping.addIrq(pic, index=1, isrtype='ISR_NIC_RX', channel=1)
181    mapping.addIrq(pic, index=2, isrtype='ISR_NIC_TX', channel=0)
182    mapping.addIrq(pic, index=3, isrtype='ISR_NIC_TX', channel=1)
183    mapping.addIrq(pic, index=4, isrtype='ISR_CMA', channel=0)
184    mapping.addIrq(pic, index=5, isrtype='ISR_CMA', channel=1)
185    mapping.addIrq(pic, index=6, isrtype='ISR_CMA', channel=2)
186    mapping.addIrq(pic, index=7, isrtype='ISR_CMA', channel=3)
187    mapping.addIrq(pic, index=8, isrtype='ISR_BDV', channel=0)
188    mapping.addIrq(pic, index=9, isrtype='ISR_TTY_RX', channel=0)
189
190    # hardware components replicated in all clusters
191    for x in xrange(x_size):
192        for y in xrange(y_size):
193            offset = pmsb(x, y) << (PADDR_WIDTH - X_WIDTH - Y_WIDTH)
194
195            mapping.addRam('RAM', base=ram_base + offset, size=ram_size)
196
197            mapping.addPeriph('MMC', base=mmc_base + offset, size=mmc_size,
198                              ptype='MMC')
199
200            mapping.addPeriph('ROM', base=rom_base + offset, size=rom_size,
201                              ptype='ROM')
202
203            dma = mapping.addPeriph('DMA', base=dma_base + offset,
204                                    size=dma_size, ptype='DMA',
205                                    channels=nb_procs)
206
207            xcu = mapping.addPeriph('XCU', base=xcu_base + offset,
208                                    size=xcu_size, ptype='XCU',
209                                    channels=nb_procs * IRQ_PER_PROC,
210                                    arg=16)
211
212            # MMC IRQ replicated in all clusters
213            mapping.addIrq(xcu, index=0, isrtype='ISR_MMC')
214
215            # DMA IRQ replicated in all clusters
216            for i in xrange(dma.channels):
217                mapping.addIrq(xcu, index=1+i, isrtype='ISR_DMA',
218                               channel=i)
219
220            # processors
221            for p in xrange(nb_procs):
222                mapping.addProc(x, y, p)
223
224    ############################################################################
225    # GIET_VM specifics
226
227    # define bootloader vsegs base addresses
228    bmapping_vbase = 0x00001000           # ident
229    bmapping_size = 0x0007F000            # 508 Kbytes
230
231    bcode_vbase = 0x00080000              # ident
232    bcode_size = 0x00040000               # 256 Kbytes
233
234    bdata_vbase = 0x000C0000              # ident
235    bdata_size = 0x00080000               # 512 Kbytes
236
237    bstack_vbase = 0x00140000             # ident
238    bstack_size = 0x00050000              # 320 Kbytes
239
240    # define kernel vsegs base addresses and sizes
241    kcode_vbase = 0x80000000
242    kcode_size = 0x00080000               # 512 Kbytes
243
244    kinit_vbase = 0x80800000
245    kinit_size = 0x00080000               # 512 Kbytes
246
247    kdata_vbase = 0x80100000
248    kdata_size = 0x00080000               # 512 Kbytes
249
250    kuncdata_vbase = 0x80180000
251    kuncdata_size = 0x00001000            # 4 Kbytes
252
253    kptab_vbase = 0xC0000000
254    kptab_size = 0x00200000               # 512 Kbytes
255
256    ksched_vbase = 0xF0000000             # distributed in all clusters
257    ksched_size = 0x2000 * nb_procs       # 8 kbytes per processor
258
259    # global vsegs for boot_loader / identity mapping
260    mapping.addGlobal('seg_boot_mapping', bmapping_vbase, bmapping_size,
261                      'CXW_', vtype='BLOB', x=0, y=0, pseg='RAM',
262                      identity=True, local=False, big=True)
263
264    mapping.addGlobal('seg_boot_code', bcode_vbase, bcode_size,
265                      'CXW_', vtype='BUFFER', x=0, y=0, pseg='RAM',
266                      identity=True, local=False, big=True)
267
268    mapping.addGlobal('seg_boot_data', bdata_vbase, bdata_size,
269                      'CXW_', vtype='BUFFER', x=0, y=0, pseg='RAM',
270                      identity=True, local=False, big=True)
271
272    mapping.addGlobal('seg_boot_stack', bstack_vbase, bstack_size,
273                      'CXW_', vtype='BUFFER', x=0, y=0, pseg='RAM',
274                      identity=True, local=False, big=True)
275
276    # the code global vsegs for kernel can be replicated in all clusters
277    # if the page tables are distributed in all clusters.
278    for x in xrange(x_size):
279        for y in xrange(y_size):
280            mapping.addGlobal('seg_kernel_code', kcode_vbase, kcode_size,
281                              'CXW_', vtype='ELF', x=x, y=y, pseg='RAM',
282                              binpath='build/kernel/kernel.elf',
283                              local=True, big=True)
284
285            mapping.addGlobal('seg_kernel_init', kinit_vbase, kinit_size,
286                              'CXW_', vtype='ELF', x=x, y=y, pseg='RAM',
287                              binpath='build/kernel/kernel.elf',
288                              local=True, big=True)
289
290            offset = pmsb(x, y) * PTAB_INCREMENT
291            mapping.addGlobal('seg_kernel_ptab_%d_%d' % (x, y),
292                              kptab_vbase + offset, kptab_size, 'C_W_',
293                              vtype='PTAB', x=x, y=y, pseg='RAM',
294                              local=False, big=True)
295
296
297            offset = pmsb(x, y) * SCHED_INCREMENT
298            mapping.addGlobal('seg_kernel_sched_%d_%d' % (x, y),
299                              ksched_vbase + offset, ksched_size, 'C_W_',
300                              vtype='SCHED', x=x, y=y, pseg='RAM',
301                              local=False, big=False)
302
303    # shared global vsegs for kernel
304    mapping.addGlobal('seg_kernel_data', kdata_vbase, kdata_size,
305                      'CXW_', vtype='ELF', x=0, y=0, pseg='RAM',
306                      binpath='build/kernel/kernel.elf', local=False,
307                      big=True)
308
309    mapping.addGlobal('seg_kernel_uncdata', kuncdata_vbase, kuncdata_size,
310                      'CXW_', vtype='ELF', x=0, y=0, pseg='RAM',
311                      binpath='build/kernel/kernel.elf', local=False,
312                      big=True)
313
314    # global vsegs for external peripherals / identity mapping
315    mapping.addGlobal('seg_iob', iob_base, iob_size, '__W_', vtype='PERI',
316                      x=X_IO, y=Y_IO, pseg='IOB', local=False, big=False)
317
318    mapping.addGlobal('seg_bdv', bdv_base, bdv_size, '__W_', vtype='PERI',
319                      x=X_IO, y=Y_IO, pseg='BDV', local=False, big=False)
320
321    mapping.addGlobal('seg_tty', tty_base, tty_size, '__W_', vtype='PERI',
322                      x=X_IO, y=Y_IO, pseg='TTY', local=False, big=False)
323
324    mapping.addGlobal('seg_nic', nic_base, nic_size, '__W_', vtype='PERI',
325                      x=X_IO, y=Y_IO, pseg='NIC', local=False, big=False)
326
327    mapping.addGlobal('seg_cma', cma_base, cma_size, '__W_', vtype='PERI',
328                      x=X_IO, y=Y_IO, pseg='CMA', local=False, big=False)
329
330    mapping.addGlobal('seg_fbf', fbf_base, fbf_size, '__W_', vtype='PERI',
331                      x=X_IO, y=Y_IO, pseg='FBF', local=False, big=True)
332
333    mapping.addGlobal('seg_pic', pic_base, pic_size, '__W_', vtype='PERI',
334                      x=X_IO, y=Y_IO, pseg='PIC', local=False, big=False)
335
336    mapping.addGlobal('seg_sim', sim_base, sim_size, '__W_', vtype='PERI',
337                      x=X_IO, y=Y_IO, pseg='SIM', local=False, big=False)
338
339    # global vsegs for internal peripherals
340    for x in xrange(x_size):
341        for y in xrange(y_size):
342            offset = pmsb(x, y) * PERI_INCREMENT
343
344            mapping.addGlobal('seg_rom_%d_%d' % (x, y), rom_base + offset,
345                              rom_size, 'CX__', vtype='PERI', x=x, y=y,
346                              pseg='ROM', local=False, big=False)
347
348            mapping.addGlobal('seg_xcu_%d_%d' % (x, y), xcu_base + offset,
349                              xcu_size, '__W_', vtype='PERI', x=x, y=y,
350                              pseg='XCU', local=False, big=False)
351
352            mapping.addGlobal('seg_dma_%d_%d' % (x, y), dma_base + offset,
353                              dma_size, '__W_', vtype='PERI', x=x, y=y,
354                              pseg='DMA', local=False, big=False)
355
356            mapping.addGlobal('seg_mmc_%d_%d' % (x, y), mmc_base + offset,
357                              mmc_size, '__W_', vtype='PERI', x=x, y=y,
358                              pseg='MMC', local=False, big=False)
359
360    return mapping
361
362def main(x, y, p, hard_path, xml_path):
363    """main function: it generates the map.xml and the hard_config.h file based
364    on the Mapping object returned by arch()"""
365    mapping = arch(x_size=x,
366                   y_size=y,
367                   nb_procs=p)
368
369    with open(xml_path, "w") as map_xml:
370        map_xml.write(mapping.xml())
371    with open(hard_path, "w") as hard_config:
372        hard_config.write(mapping.hard_config())
373
374################################# platform test ################################
375import sys
376if __name__ == '__main__':
377    main(x=int(sys.argv[1]),
378         y=int(sys.argv[2]),
379         p=int(sys.argv[3]),
380         hard_path="hard_config.test.h",
381         xml_path="map.test.xml")
382
383# Local Variables:
384# tab-width: 4;
385# c-basic-offset: 4;
386# c-file-offsets:((innamespace . 0)(inline-open . 0));
387# indent-tabs-mode: nil;
388# End:
389#
390# vim: filetype=python:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
391
Note: See TracBrowser for help on using the repository browser.