source: trunk/tools/arch_info/arch_classes.py

Last change on this file was 687, checked in by alain, 6 years ago

cosmetic

File size: 38.8 KB
Line 
1#!/usr/bin/env python
2
3import sys
4
5##########################################################################################
6# File : arch_classes.py
7# Date : 2016
8# Author : Alain Greiner
9# Copyright (c) UPMC Sorbonne Universites
10#########################################################################################
11# This file contains the python classes required to define a generic hardware
12# architecture for the ALMOS-MK operating system.
13# It handle 4 types of objects: clusters, cores, devices and irqs.
14# - The number of cluster is variable (can be one).
15# - The cluster topology can be a 2D mesh or a simple 1D array.
16# - The number of cores per cluster is variable (can be zero).
17# - The number of addressable devices per cluster is variable.
18# - The size of the physical memory bank per cluster is variable.
19# An adressable device can be a physical memory bank or a peripheral.
20# Each cluster cover a fixed size segment in physical address space,
21# that is defined by (PADDR_WIDTH - X_WIDTH - Y_WIDTH)
22#########################################################################################
23# Implementation Note:
24# The objects used to describe an architecture are distributed in the python structure:
25# For example the set of cores and the set of devices are split in several subsets
26# (one subset of cores and one subset of devices per cluster).
27# In the generated C binary data structure, all objects of same type
28# are stored in a linear array (one single array for all cores for example).
29# For all objects, we compute and store in the python object a "global index"
30# corresponding to the index in this global array, and this index can be used as
31# a pseudo-pointer to identify a specific object of a given type.
32#########################################################################################
33
34#########################################################################################
35# Define global parameters
36#########################################################################################
37
38ARCHINFO_SIGNATURE = 0xBABE2016 # magic number indicating a valid C BLOB
39PAGE_SIZE = 0x1000 # to check peripherals alignment
40
41#########################################################################################
42# These arrays define the supported types of peripherals.
43# They must be kept consistent with values defined in file arch_info.h
44#########################################################################################
45
46DEVICE_TYPES_STR = [
47 'RAM_SCL', # 0.0
48 'ROM_SCL', # 1.0
49 'FBF_SCL', # 2.0
50 'FBF_LTI', # 2.1
51 'IOB_TSR', # 3.0
52 'IOC_BDV', # 4.0
53 'IOC_HBA', # 4.1
54 'IOC_SDC', # 4.2
55 'IOC_SPI', # 4.3
56 'IOC_RDK', # 4.4
57 'MMC_TSR', # 5.0
58 'DMA_SCL', # 6.0
59 'NIC_CBF', # 7.0
60 'TIM_SCL', # 8.0
61 'TXT_TTY', # 9.0
62 'TXT_RS2', # 9.1
63 'TXT_MTY', # 9.2
64 'ICU_XCU', # A.0
65 'PIC_TSR', # B.0
66 ]
67
68DEVICE_TYPES_INT = [
69 0x00000000, # 0.0
70 0x00010000, # 1.0
71 0x00020000, # 2.0
72 0x00020001, # 2.1
73 0x00030000, # 3.0
74 0x00040000, # 4.0
75 0x00040001, # 4.1
76 0x00040002, # 4.2
77 0x00040003, # 4.3
78 0x00040004, # 4.4
79 0x00050000, # 5.0
80 0x00060000, # 6.0
81 0x00070000, # 7.0
82 0x00080000, # 8.0
83 0x00090000, # 9.0
84 0x00090001, # 9.1
85 0x00090002, # 9.2
86 0x000A0000, # A.0
87 0x000B0000, # B.0
88 ]
89
90#########################################################################################
91class Archinfo( object ):
92#########################################################################################
93 def __init__( self,
94 name, # architecture instance name
95 x_size, # number of clusters in a row
96 y_size, # number of clusters in a column
97 cores_max, # max number of cores per cluster
98 devices_max, # max number of devices per cluster
99 paddr_width, # number of bits in physical address
100 x_width, # number of bits for x coordinate
101 y_width, # number of bits for y coordinate
102 irqs_per_core, # number or IRQs from ICU to one core
103 io_cxy, # IO cluster identifier
104 boot_cxy, # boot cluster identifier
105 cache_line, # number of bytes in cache line
106 reset_address, # Preloader physical base address
107 p_width, # TSAR specific : number of bits to code core lid
108 sys_clk ): # system clock frequency (in Hertz)
109
110 assert ( x_size <= (1<<x_width) )
111 assert ( y_size <= (1<<y_width) )
112
113 self.signature = ARCHINFO_SIGNATURE
114 self.name = name
115 self.x_size = x_size
116 self.y_size = y_size
117 self.cores_max = cores_max
118 self.devices_max = devices_max
119 self.paddr_width = paddr_width
120 self.x_width = x_width
121 self.y_width = y_width
122 self.irqs_per_core = irqs_per_core
123 self.io_cxy = io_cxy
124 self.boot_cxy = boot_cxy
125 self.cache_line = cache_line
126 self.reset_address = reset_address
127 self.p_width = p_width
128 self.sys_clk = sys_clk
129
130 self.total_cores = 0
131 self.total_devices = 0
132 self.total_irqs = 0
133
134 self.clusters = []
135
136 for x in xrange( self.x_size ):
137 for y in xrange( self.y_size ):
138
139 # call cluster constructor
140 cxy = (x<<y_width) + y
141 cluster = Cluster( cxy )
142
143 # update cluster global index
144 cluster.index = (x * self.y_size) + y
145
146 # register cluster in Archinfo
147 self.clusters.append( cluster )
148
149 return
150
151 ########################## add a device in a cluster
152 def addDevice( self,
153 ptype, # device type
154 base, # associated pseg base address
155 size, # associated pseg length (bytes)
156 channels = 1, # number of channels
157 arg0 = 0, # optional argument (semantic depends on ptype)
158 arg1 = 0, # optional argument (semantic depends on ptype)
159 arg2 = 0, # optional argument (semantic depends on ptype)
160 arg3 = 0 ): # optional argument (semantic depends on ptype)
161
162 # computes cluster identifier and global index from the base address
163 cxy = base >> (self.paddr_width - self.x_width - self.y_width)
164 x = cxy >> (self.y_width);
165 y = cxy & ((1 << self.y_width) - 1)
166 cluster_id = (x * self.y_size) + y
167
168 assert (x < self.x_size) and (y < self.y_size)
169 assert (base & (PAGE_SIZE-1) == 0)
170 assert (ptype in DEVICE_TYPES_STR)
171
172 # call device constructor
173 device = Device( base, size, ptype, channels, arg0, arg1, arg2, arg3 )
174
175 # register device in cluster
176 self.clusters[cluster_id].devices.append( device )
177
178 # update device global index
179 device.index = self.total_devices
180 self.total_devices += 1
181
182 return device
183
184 ################################ add an input IRQ in a device
185 def addIrq( self,
186 dstdev, # destination device (PIC or ICU)
187 port, # input IRQ port index
188 srcdev, # source device
189 channel = 0, # source device channel
190 is_rx = False ): # I/O operation direction
191
192 assert (dstdev.ptype == 'ICU_XCU') or (dstdev.ptype == 'PIC_TSR')
193 assert (port < dstdev.arg0)
194
195 # call Irq constructor
196 irq = Irq( port , srcdev, channel , is_rx )
197
198 # register IRQ in destination device
199 dstdev.irqs.append( irq )
200
201 # update IRQ global index
202 irq.index = self.total_irqs
203 self.total_irqs += 1
204
205 # pointer from the source to the interrupt controller device
206 if (srcdev.irq_ctrl == None): srcdev.irq_ctrl = dstdev
207
208 if (srcdev.irq_ctrl != dstdev):
209 print '[genarch error] in addIrq():'
210 print ' two different interrupt controller for the same device'
211 sys.exit(1)
212
213 return irq
214
215 ########################## add a core in a cluster
216 def addCore( self,
217 gid, # global hardware identifier
218 cxy, # cluster identifier
219 lid ): # local index in cluster
220
221 assert ((cxy >> self.y_width) < self.x_size)
222 assert ((cxy & ((1<<self.y_width)-1)) < self.y_size)
223 assert (lid < self.cores_max)
224
225 # call Core contructor
226 core = Core( gid, cxy, lid )
227
228 # compute cluster global index from cluster identifier
229 x = cxy>>self.y_width
230 y = cxy & ((1<<self.y_width)-1)
231 cluster_id = (x * self.y_size) + y
232
233 # register core in cluster
234 self.clusters[cluster_id].cores.append( core )
235
236 # update core global index
237 core.index = self.total_cores
238 self.total_cores += 1
239
240 return core
241
242 #################################
243 def str2bytes( self, nbytes, s ): # string => nbytes_packed byte array
244
245 byte_stream = bytearray()
246 length = len( s )
247 if length < (nbytes - 1):
248 for b in s:
249 byte_stream.append( b )
250 for x in xrange(nbytes-length):
251 byte_stream.append( '\0' )
252 else:
253 print '[genarch error] in str2bytes()'
254 print ' string %s too long' % s
255 sys.exit(1)
256
257 return byte_stream
258
259 ###################################
260 def int2bytes( self, nbytes, val ): # integer => nbytes litle endian byte array
261
262 byte_stream = bytearray()
263 for n in xrange( nbytes ):
264 byte_stream.append( (val >> (n<<3)) & 0xFF )
265
266 return byte_stream
267
268 ################
269 def xml( self ): # compute string for xml file generation
270
271 s = '<?xml version="1.0"?>\n\n'
272 s += '<arch_info signature = "0x%x"\n' % (self.signature)
273 s += ' name = "%s"\n' % (self.name)
274 s += ' x_size = "%d"\n' % (self.x_size)
275 s += ' y_size = "%d"\n' % (self.y_size)
276 s += ' cores = "%d"\n' % (self.cores_max)
277 s += ' io_cxy = "%d"\n' % (self.io_cxy)
278 s += ' sys_clk = "%d" >\n' % (self.sys_clk)
279 s += '\n'
280
281 s += ' <clusterset>\n'
282 for x in xrange ( self.x_size ):
283 for y in xrange ( self.y_size ):
284 cluster_id = (x * self.y_size) + y
285 s += self.clusters[cluster_id].xml()
286 s += ' </clusterset>\n'
287 s += '\n'
288
289 s += '</arch_info>\n'
290 return s
291
292 ##########################
293 def cbin( self, verbose ): # C binary structure for "archinfo.bin" file generation
294
295 byte_stream = bytearray()
296
297 # header
298 byte_stream += self.int2bytes(4, self.signature)
299 byte_stream += self.int2bytes(4, self.x_size)
300 byte_stream += self.int2bytes(4, self.y_size)
301 byte_stream += self.int2bytes(4, self.paddr_width)
302 byte_stream += self.int2bytes(4, self.x_width)
303 byte_stream += self.int2bytes(4, self.y_width)
304 byte_stream += self.int2bytes(4, self.cores_max)
305 byte_stream += self.int2bytes(4, self.devices_max)
306
307 byte_stream += self.int2bytes(4, self.total_cores)
308 byte_stream += self.int2bytes(4, self.total_devices)
309 byte_stream += self.int2bytes(4, self.total_irqs)
310 byte_stream += self.int2bytes(4, self.io_cxy)
311 byte_stream += self.int2bytes(4, self.boot_cxy)
312 byte_stream += self.int2bytes(4, self.irqs_per_core)
313 byte_stream += self.int2bytes(4, self.cache_line)
314 byte_stream += self.int2bytes(4, self.sys_clk)
315
316 byte_stream += self.str2bytes(64, self.name)
317
318 if ( verbose ):
319 print '\n'
320 print 'name = %s' % self.name
321 print 'signature = %x' % self.signature
322 print 'x_size = %d' % self.x_size
323 print 'y_size = %d' % self.y_size
324 print 'total_cores = %d' % self.total_cores
325 print 'total_devices = %d' % self.total_devices
326 print 'total_irqs = %d' % self.total_irqs
327 print '\n'
328
329 # cores array
330 index = 0
331 for cluster in self.clusters:
332 for core in cluster.cores:
333 byte_stream += core.cbin( self, verbose, index )
334 index += 1
335
336 if ( verbose ): print '\n'
337
338 # clusters array
339 index = 0
340 for cluster in self.clusters:
341 byte_stream += cluster.cbin( self, verbose, index )
342 index += 1
343
344 if ( verbose ): print '\n'
345
346 # devices array
347 index = 0
348 for cluster in self.clusters:
349 for device in cluster.devices:
350 byte_stream += device.cbin( self, verbose, index )
351 index += 1
352
353 if ( verbose ): print '\n'
354
355 # irqs array
356 index = 0
357 for cluster in self.clusters:
358 for device in cluster.devices:
359 for irq in device.irqs:
360 byte_stream += irq.cbin( self, verbose, index )
361 index += 1
362
363 if ( verbose ): print '\n'
364
365 return byte_stream
366 # end of cbin()
367
368
369 ######################################################################
370 def hard_config( self ): # compute string for hard_config.h file
371 # required by
372 # - top.cpp compilation
373 # - almos-mkh bootloader compilation
374 # - tsar_preloader compilation
375
376 # for each device type, define default values
377 # for pbase address, size, number of components, and channels
378 nb_ram = 0
379 ram_channels = 0
380 ram_base = 0xFFFFFFFFFFFFFFFF
381 ram_size = 0
382
383 nb_rom = 0
384 rom_channels = 0
385 rom_base = 0xFFFFFFFFFFFFFFFF
386 rom_size = 0
387
388 nb_fbf = 0
389 fbf_channels = 0
390 fbf_base = 0xFFFFFFFFFFFFFFFF
391 fbf_size = 0
392 fbf_arg0 = 0
393 fbf_arg1 = 0
394 use_fbf_scl = False
395 use_fbf_lti = False
396
397 nb_iob = 0
398 iob_channels = 0
399 iob_base = 0xFFFFFFFFFFFFFFFF
400 iob_size = 0
401
402 nb_ioc = 0
403 ioc_channels = 0
404 ioc_base = 0xFFFFFFFFFFFFFFFF
405 ioc_size = 0
406 use_ioc_bdv = False
407 use_ioc_sdc = False
408 use_ioc_hba = False
409 use_ioc_spi = False
410 use_ioc_rdk = False
411
412 nb_mmc = 0
413 mmc_channels = 0
414 mmc_base = 0xFFFFFFFFFFFFFFFF
415 mmc_size = 0
416
417 nb_dma = 0
418 dma_channels = 0
419 dma_base = 0xFFFFFFFFFFFFFFFF
420 dma_size = 0
421
422 nb_nic = 0
423 nic_channels = 0
424 nic_base = 0xFFFFFFFFFFFFFFFF
425 nic_size = 0
426
427 nb_sim = 0
428 sim_channels = 0
429 sim_base = 0xFFFFFFFFFFFFFFFF
430 sim_size = 0
431
432 nb_tim = 0
433 tim_channels = 0
434 tim_base = 0xFFFFFFFFFFFFFFFF
435 tim_size = 0
436
437 nb_txt = 0
438 txt_channels = 0
439 txt_base = 0xFFFFFFFFFFFFFFFF
440 txt_size = 0
441 use_txt_tty = False
442 use_txt_rs2 = False
443 use_txt_mty = False
444
445 nb_icu = 0
446 icu_channels = 0
447 icu_base = 0xFFFFFFFFFFFFFFFF
448 icu_size = 0
449 icu_arg0 = 0
450
451 nb_pic = 0
452 pic_channels = 0
453 pic_base = 0xFFFFFFFFFFFFFFFF
454 pic_size = 0
455
456 nb_rom = 0
457 rom_channels = 0
458 rom_base = 0xFFFFFFFFFFFFFFFF
459 rom_size = 0
460
461 # get devices attributes
462 for cluster in self.clusters:
463 for device in cluster.devices:
464
465 if ( device.ptype == 'RAM_SCL' ):
466 ram_base = device.base
467 ram_size = device.size
468 ram_channels = device.channels
469 nb_ram +=1
470
471 elif ( device.ptype == 'ROM_SCL' ):
472 rom_base = device.base
473 rom_size = device.size
474 rom_channels = device.channels
475 nb_rom +=1
476
477 elif ( device.ptype == 'FBF_SCL' ):
478 fbf_base = device.base
479 fbf_size = device.size
480 fbf_channels = device.channels
481 use_fbf_scl = True
482 fbf_arg0 = device.arg0
483 fbf_arg1 = device.arg1
484 nb_fbf +=1
485 elif ( device.ptype == 'FBF_LTI' ):
486 fbf_base = device.base
487 fbf_size = device.size
488 fbf_channels = device.channels
489 use_fbf_lti = True
490 fbf_arg0 = device.arg0
491 fbf_arg1 = device.arg1
492 nb_fbf +=1
493
494 elif ( device.ptype == 'IOB_TSR' ):
495 iob_base = device.base
496 iob_size = device.size
497 iob_channels = device.channels
498 nb_iob +=1
499
500 elif ( device.ptype == 'IOC_BDV' ):
501 ioc_base = device.base
502 ioc_size = device.size
503 ioc_channels = device.channels
504 use_ioc_bdv = True
505 nb_ioc += 1
506 elif ( device.ptype == 'IOC_HBA' ):
507 ioc_base = device.base
508 ioc_size = device.size
509 ioc_channels = device.channels
510 use_ioc_hba = True
511 nb_ioc += 1
512 elif ( device.ptype == 'IOC_SDC' ):
513 ioc_base = device.base
514 ioc_size = device.size
515 ioc_channels = device.channels
516 use_ioc_sdc = True
517 nb_ioc += 1
518 elif ( device.ptype == 'IOC_SPI' ):
519 ioc_base = device.base
520 ioc_size = device.size
521 ioc_channels = device.channels
522 use_ioc_spi = True
523 nb_ioc += 1
524 elif ( device.ptype == 'IOC_RDK' ):
525 ioc_base = device.base
526 ioc_size = device.size
527 ioc_channels = device.channels
528 use_ioc_rdk = True
529 nb_ioc += 1
530
531 elif ( device.ptype == 'MMC_TSR' ):
532 mmc_base = device.base
533 mmc_size = device.size
534 mmc_channels = device.channels
535 nb_mmc +=1
536
537 elif ( device.ptype == 'DMA_SCL' ):
538 dma_base = device.base
539 dma_size = device.size
540 dma_channels = device.channels
541 nb_dma +=1
542
543 elif ( device.ptype == 'NIC_CBF' ):
544 nic_base = device.base
545 nic_size = device.size
546 nic_channels = device.channels
547 nb_nic +=1
548
549 elif ( device.ptype == 'TIM_SCL' ):
550 tim_base = device.pseg.base
551 tim_size = device.pseg.size
552 tim_channels = device.channels
553 nb_tim +=1
554
555 elif ( device.ptype == 'TXT_TTY' ):
556 txt_base = device.base
557 txt_size = device.size
558 txt_channels = device.channels
559 use_txt_tty = True
560 nb_txt +=1
561 elif ( device.ptype == 'TXT_RS2' ):
562 txt_base = device.base
563 txt_size = device.size
564 txt_channels = device.channels
565 use_txt_rs2 = True
566 nb_txt +=1
567 elif ( device.ptype == 'TXT_MTY' ):
568 txt_base = device.base
569 txt_size = device.size
570 txt_channels = device.channels
571 use_txt_mty = True
572 nb_txt +=1
573
574 elif ( device.ptype == 'ICU_XCU' ):
575 icu_base = device.base
576 icu_size = device.size
577 icu_channels = device.channels
578 icu_arg0 = device.arg0
579 icu_arg1 = device.arg1
580 icu_arg2 = device.arg2
581 icu_arg3 = device.arg3
582 nb_icu +=1
583
584 elif ( device.ptype == 'PIC_TSR' ):
585 pic_base = device.base
586 pic_size = device.size
587 pic_channels = device.channels
588 nb_pic +=1
589
590 # one and only one IOC controller
591 assert ( nb_ioc == 1 )
592
593 # compute rdk_base and rdk_size
594 if( use_ioc_rdk ):
595 rdk_base = ioc_base
596 rdk_size = ioc_size
597 else:
598 rdk_base = 0
599 rdk_size = 0
600
601 # Compute total number of cores, devices and irqs
602 nb_total_cores = self.total_cores
603 nb_total_devices = self.total_devices
604 nb_total_irqs = self.total_irqs
605
606 # boot core has (cxy == boot_cxy) and (lid == 0)
607 for cluster in self.clusters:
608 if( cluster.cxy == self.boot_cxy ): boot_core_gid = cluster.cores[0].gid
609
610 # compute mask to get local physical address (cluster independant)
611 local_paddr_width = self.paddr_width - self.x_width - self.y_width
612 local_physical_mask = (1<<local_paddr_width)-1
613
614 # build string
615 s = '/* Generated by genarch for %s */\n' % self.name
616 s += '\n'
617 s += '#ifndef HARD_CONFIG_H\n'
618 s += '#define HARD_CONFIG_H\n'
619 s += '\n'
620
621 s += '/* General platform parameters */\n'
622 s += '\n'
623 s += '#define X_SIZE %d\n' % self.x_size
624 s += '#define Y_SIZE %d\n' % self.y_size
625 s += '#define PADDR_WIDTH %d\n' % self.paddr_width
626 s += '#define X_WIDTH %d\n' % self.x_width
627 s += '#define Y_WIDTH %d\n' % self.y_width
628 s += '#define P_WIDTH %d\n' % self.p_width
629 s += '#define X_IO %d\n' % (self.io_cxy >> self.y_width)
630 s += '#define Y_IO %d\n' % (self.io_cxy & ((1<<self.y_width)-1))
631 s += '#define NB_PROCS_MAX %d\n' % self.cores_max
632 s += '#define NB_DEVICES_MAX %d\n' % self.devices_max
633 s += '#define IRQ_PER_PROCESSOR %d\n' % self.irqs_per_core
634 s += '#define RESET_ADDRESS 0x%x\n' % self.reset_address
635 s += '#define NB_TOTAL_PROCS %d\n' % nb_total_cores
636 s += '#define BOOT_CORE_GID %d\n' % boot_core_gid
637 s += '#define BOOT_CORE_CXY %d\n' % self.boot_cxy
638 s += '#define CACHE_LINE_SIZE %d\n' % self.cache_line
639 s += '#define SYS_CLK %d\n' % self.sys_clk
640 s += '\n'
641
642 s += '/* Peripherals */\n'
643 s += '\n'
644 s += '#define NB_TXT_CHANNELS %d\n' % txt_channels
645 s += '#define NB_IOC_CHANNELS %d\n' % ioc_channels
646 s += '#define NB_NIC_CHANNELS %d\n' % nic_channels
647 s += '#define NB_TIM_CHANNELS %d\n' % tim_channels
648 s += '\n'
649 s += '#define USE_ICU %d\n' % ( nb_icu != 0 )
650 s += '#define USE_IOB %d\n' % ( nb_iob != 0 )
651 s += '#define USE_PIC %d\n' % ( nb_pic != 0 )
652 s += '#define USE_FBF %d\n' % ( nb_fbf != 0 )
653 s += '#define USE_NIC %d\n' % ( nb_nic != 0 )
654 s += '#define USE_DMA %d\n' % ( nb_dma != 0 )
655 s += '\n'
656 s += '#define USE_IOC_BDV %d\n' % use_ioc_bdv
657 s += '#define USE_IOC_SDC %d\n' % use_ioc_sdc
658 s += '#define USE_IOC_HBA %d\n' % use_ioc_hba
659 s += '#define USE_IOC_SPI %d\n' % use_ioc_spi
660 s += '#define USE_IOC_RDK %d\n' % use_ioc_rdk
661 s += '\n'
662 s += '#define USE_TXT_TTY %d\n' % use_txt_tty
663 s += '#define USE_TXT_RS2 %d\n' % use_txt_rs2
664 s += '#define USE_TXT_MTY %d\n' % use_txt_mty
665 s += '\n'
666 s += '#define USE_FBF_SCL %d\n' % use_fbf_scl
667 s += '#define USE_FBF_LTI %d\n' % use_fbf_lti
668 s += '\n'
669 s += '#define FBUF_X_SIZE %d\n' % fbf_arg0
670 s += '#define FBUF_Y_SIZE %d\n' % fbf_arg1
671 s += '\n'
672 s += '#define ICU_NB_HWI %d\n' % icu_arg0
673 s += '#define ICU_NB_PTI %d\n' % icu_arg1
674 s += '#define ICU_NB_WTI %d\n' % icu_arg2
675 s += '#define ICU_NB_OUT %d\n' % icu_arg3
676 s += '\n'
677
678 s += '/* local physical base address and size for devices */\n'
679 s += '\n'
680 s += '#define SEG_RAM_BASE 0x%x\n' % (ram_base & local_physical_mask)
681 s += '#define SEG_RAM_SIZE 0x%x\n' % ram_size
682 s += '\n'
683 s += '#define SEG_FBF_BASE 0x%x\n' % (fbf_base & local_physical_mask)
684 s += '#define SEG_FBF_SIZE 0x%x\n' % fbf_size
685 s += '\n'
686 s += '#define SEG_IOB_BASE 0x%x\n' % (iob_base & local_physical_mask)
687 s += '#define SEG_IOB_SIZE 0x%x\n' % iob_size
688 s += '\n'
689 s += '#define SEG_IOC_BASE 0x%x\n' % (ioc_base & local_physical_mask)
690 s += '#define SEG_IOC_SIZE 0x%x\n' % ioc_size
691 s += '\n'
692 s += '#define SEG_MMC_BASE 0x%x\n' % (mmc_base & local_physical_mask)
693 s += '#define SEG_MMC_SIZE 0x%x\n' % mmc_size
694 s += '\n'
695 s += '#define SEG_DMA_BASE 0x%x\n' % (dma_base & local_physical_mask)
696 s += '#define SEG_DMA_SIZE 0x%x\n' % dma_size
697 s += '\n'
698 s += '#define SEG_ROM_BASE 0x%x\n' % (rom_base & local_physical_mask)
699 s += '#define SEG_ROM_SIZE 0x%x\n' % rom_size
700 s += '\n'
701 s += '#define SEG_SIM_BASE 0x%x\n' % (sim_base & local_physical_mask)
702 s += '#define SEG_SIM_SIZE 0x%x\n' % sim_size
703 s += '\n'
704 s += '#define SEG_NIC_BASE 0x%x\n' % (nic_base & local_physical_mask)
705 s += '#define SEG_NIC_SIZE 0x%x\n' % nic_size
706 s += '\n'
707 s += '#define SEG_PIC_BASE 0x%x\n' % (pic_base & local_physical_mask)
708 s += '#define SEG_PIC_SIZE 0x%x\n' % pic_size
709 s += '\n'
710 s += '#define SEG_TIM_BASE 0x%x\n' % (tim_base & local_physical_mask)
711 s += '#define SEG_TIM_SIZE 0x%x\n' % tim_size
712 s += '\n'
713 s += '#define SEG_TXT_BASE 0x%x\n' % (txt_base & local_physical_mask)
714 s += '#define SEG_TXT_SIZE 0x%x\n' % txt_size
715 s += '\n'
716 s += '#define SEG_ICU_BASE 0x%x\n' % (icu_base & local_physical_mask)
717 s += '#define SEG_ICU_SIZE 0x%x\n' % icu_size
718 s += '\n'
719 s += '#define SEG_RDK_BASE 0x%x\n' % (rdk_base & local_physical_mask)
720 s += '#define SEG_RDK_SIZE 0x%x\n' % rdk_size
721 s += '\n'
722 s += '#endif\n'
723
724 return s
725
726 # end of hard_config()
727
728
729
730
731
732###################################################################################
733class Cluster ( object ):
734###################################################################################
735 def __init__( self,
736 cxy ):
737
738 self.index = 0 # global index (set by Archinfo constructor)
739 self.cxy = cxy # cluster identifier
740 self.cores = [] # local cores (filled by addCore)
741 self.devices = [] # local devices(filled by addDevice)
742
743 return
744
745 ################
746 def xml( self ): # xml for a cluster
747
748 s = ' <cluster cxy = "%x" >\n' % (self.cxy)
749 for core in self.cores: s += core.xml()
750 for device in self.devices: s += device.xml()
751 s += ' </cluster>\n'
752
753 return s
754
755 #############################################
756 def cbin( self, mapping, verbose, expected ): # C binary structure for Cluster
757
758 if ( verbose ):
759 print '*** cbin for cluster[%d] / identifier = %x' \
760 % (self.index , self.cxy)
761
762 # check index
763 if (self.index != expected):
764 print '[genarch error] in Cluster.cbin()'
765 print ' cluster global index = %d / expected = %d' \
766 % (self.index,expected)
767 sys.exit(1)
768
769 # compute global index for first core in cluster
770 if ( len(self.cores) > 0 ):
771 core_id = self.cores[0].index
772 else:
773 core_id = 0
774
775 # compute global index for first device in cluster
776 if ( len(self.devices) > 0 ):
777 device_id = self.devices[0].index
778 else:
779 device_id = 0
780
781 byte_stream = bytearray()
782 byte_stream += mapping.int2bytes(4,self.cxy) # cxy
783 byte_stream += mapping.int2bytes(4,len(self.cores)) # cores in cluster
784 byte_stream += mapping.int2bytes(4,core_id ) # first core global index
785 byte_stream += mapping.int2bytes(4,len(self.devices)) # devices in cluster
786 byte_stream += mapping.int2bytes(4, device_id ) # first device global index
787
788 if ( verbose ):
789 print 'nb_cores = %d' % len( self.cores )
790 print 'core_id = %d' % core_id
791 print 'nb_devices = %d' % len( self.devices )
792 print 'device_id = %d' % device_id
793
794 return byte_stream
795
796
797
798
799##################################################################################
800class Core ( object ):
801##################################################################################
802 def __init__( self,
803 gid,
804 cxy,
805 lid ):
806
807 self.index = 0 # global index / set by addProc()
808 self.gid = gid # hardware identifier
809 self.cxy = cxy # cluster identifier
810 self.lid = lid # local index in cluster
811
812 return
813
814 ###################################
815 def xml( self ): # xml for a core
816 return ' <core gid="%x" lid="%d" />\n' % (self.gid, self.lid)
817
818 ####################################################################
819 def cbin( self, mapping, verbose, expected ): # C binary for Proc
820
821 if ( verbose ):
822 print '*** cbin for core [%d] in cluster %x' \
823 % (self.lid, self.cxy)
824
825 # check index
826 if (self.index != expected):
827 print '[genarch error] in Core.cbin()'
828 print ' core global index = %d / expected = %d' \
829 % (self.index,expected)
830 sys.exit(1)
831
832 byte_stream = bytearray()
833 byte_stream += mapping.int2bytes( 4 , self.gid ) # hardware identifier
834 byte_stream += mapping.int2bytes( 2 , self.cxy ) # cluster identifier
835 byte_stream += mapping.int2bytes( 2 , self.lid ) # local index
836
837 return byte_stream
838
839
840
841
842##################################################################################
843class Device ( object ):
844##################################################################################
845 def __init__( self,
846 base,
847 size,
848 ptype,
849 channels = 1,
850 arg0 = 0,
851 arg1 = 0,
852 arg2 = 0,
853 arg3 = 0 ):
854
855 self.index = 0 # global device index ( set by addDevice() )
856 self.base = base # associated segment base
857 self.size = size # associated segment size (bytes)
858 self.ptype = ptype # device type
859 self.channels = channels # number of channels
860 self.arg0 = arg0 # optional (semantic depends on ptype)
861 self.arg1 = arg1 # optional (semantic depends on ptype)
862 self.arg2 = arg2 # optional (semantic depends on ptype)
863 self.arg3 = arg3 # optional (semantic depends on ptype)
864 self.irqs = [] # set of input IRQs (for PIC and ICU only)
865 self.irq_ctrl = None # interrupt controller for this device
866 return
867
868 ######################################
869 def xml( self ): # xml for a device
870
871 s = ' <device type="%s"' % self.ptype
872 s += ' base="%x"' % self.base
873 s += ' size="%x"' % self.size
874 s += ' channels="%d"' % self.channels
875 s += ' arg0="%d"' % self.arg0
876 s += ' arg1="%d"' % self.arg1
877 s += ' arg2="%d"' % self.arg2
878 s += ' arg3="%d"' % self.arg3
879 if ( (self.ptype == 'PIC_TSR') or (self.ptype == 'ICU_XCU') ):
880 s += ' >\n'
881 for irq in self.irqs: s += irq.xml()
882 s += ' </device>\n'
883 else:
884 s += ' />\n'
885 return s
886
887 ######################################################################
888 def cbin( self, mapping, verbose, expected ): # C binary for Periph
889
890 if ( verbose ):
891 print '*** cbin for device[%d] / type = %s / base = %x' \
892 % (self.index , self.ptype , self.base)
893
894 # check index
895 if (self.index != expected):
896 print '[genarch error] in Periph.cbin()'
897 print ' device global index = %d / expected = %d' \
898 % (self.index,expected)
899 sys.exit(1)
900
901 # compute first irq global index
902 if ( len(self.irqs) > 0 ):
903 irq_id = self.irqs[0].index
904 else:
905 irq_id = 0
906
907 # compute device type numerical value
908 ptype_id = 0xFFFFFFFF
909 for x in xrange( len(DEVICE_TYPES_STR) ):
910 if ( self.ptype == DEVICE_TYPES_STR[x] ): ptype_id = DEVICE_TYPES_INT[x]
911
912 if ( ptype_id == 0xFFFFFFFF ):
913 print '[genarch error] in Device.cbin()'
914 print ' undefined device type %s' % self.ptype
915 sys.exit(1)
916
917 byte_stream = bytearray()
918 byte_stream += mapping.int2bytes(8,self.base) # segment base address
919 byte_stream += mapping.int2bytes(8,self.size) # segment size
920 byte_stream += mapping.int2bytes(4,ptype_id) # device type
921 byte_stream += mapping.int2bytes(4,self.channels) # number of channels
922 byte_stream += mapping.int2bytes(4,self.arg0) # optionnal arg0
923 byte_stream += mapping.int2bytes(4,self.arg1) # optionnal arg1
924 byte_stream += mapping.int2bytes(4,self.arg2) # optionnal arg2
925 byte_stream += mapping.int2bytes(4,self.arg3) # optionnal arg3
926 byte_stream += mapping.int2bytes(4,len(self.irqs)) # number of input irqs
927 byte_stream += mapping.int2bytes(4 ,irq_id) # first irq global index
928
929 if ( verbose ):
930 print 'base = %x' % self.base
931 print 'size = %x' % self.size
932 print 'nb_irqs = %d' % len( self.irqs )
933 print 'irq_id = %d' % irq_id
934
935 return byte_stream
936
937##################################################################################
938class Irq ( object ):
939##################################################################################
940 def __init__( self,
941 port,
942 dev,
943 channel,
944 is_rx ):
945
946 assert port < 32
947
948 self.index = 0 # global index ( set by addIrq() )
949 self.port = port # input IRQ port index
950 self.dev = dev # source device
951 self.channel = channel # source device channel
952 self.is_rx = is_rx # source device direction
953
954 return
955
956 ################################
957 def xml( self ): # xml for Irq
958 s = ' <irq port="%d" devtype="%s" channel="%d" is_rx="%d" />\n' \
959 % ( self.port, self.dev.ptype, self.channel, self.is_rx )
960 return s
961
962 ####################################################################
963 def cbin( self, mapping, verbose, expected ): # C binary for Irq
964
965 if ( verbose ):
966 print '*** cbin for irq[%d] / src_dev = %s' \
967 % (self.port , self.dev.ptype)
968
969 # check index
970 if (self.index != expected):
971 print '[genarch error] in Irq.cbin()'
972 print ' irq global index = %d / expected = %d' \
973 % (self.index , expected)
974 # compute source device type numerical value
975 dev_id = 0xFFFFFFFF
976 for x in xrange( len(DEVICE_TYPES_STR) ):
977 if ( self.dev.ptype == DEVICE_TYPES_STR[x] ): dev_id = DEVICE_TYPES_INT[x]
978
979 if ( dev_id == 0xFFFFFFFF ):
980 print '[genarch error] in Irq.cbin()'
981 print ' undefined device type %s' % self.dev.ptype
982 sys.exit(1)
983
984 byte_stream = bytearray()
985 byte_stream += mapping.int2bytes( 4, dev_id )
986 byte_stream += mapping.int2bytes( 1, self.channel )
987 byte_stream += mapping.int2bytes( 1, self.is_rx )
988 byte_stream += mapping.int2bytes( 1, self.port )
989 byte_stream += mapping.int2bytes( 1, 0 )
990
991 if ( verbose ):
992 print 'dev_id = %d' % dev_id
993 print 'channel = %d' % self.channel
994 print 'is_rx = %d' % self.is_rx
995 print 'port = %s' % self.port
996
997 return byte_stream
998
999# Local Variables:
1000# tab-width: 4;
1001# c-basic-offset: 4;
1002# c-file-offsets:((innamespace . 0)(inline-open . 0));
1003# indent-tabs-mode: nil;
1004# End:
1005#
1006# vim: filetype=python:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
1007
Note: See TracBrowser for help on using the repository browser.