Changeset 539 for soft/giet_vm/giet_python/mapping.py
- Timestamp:
- Mar 28, 2015, 8:04:20 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
soft/giet_vm/giet_python/mapping.py
r537 r539 3 3 import sys 4 4 5 ################################################################################### #####5 ################################################################################### 6 6 # file : giet_mapping.py 7 7 # date : april 2014 8 8 # author : Alain Greiner 9 ################################################################################### #####9 ################################################################################### 10 10 # This file contains the classes required to define a mapping for the GIET_VM. 11 11 # - A 'Mapping' contains a set of 'Cluster' (hardware architecture) … … 18 18 # a set of 'Task' (user parallel tasks) 19 19 # - A 'Periph' contains a set of 'Irq' (only for XCU and PIC types ) 20 ################################################################################### #####20 ################################################################################### 21 21 # Implementation Note 22 22 # The objects used to describe a mapping are distributed in the PYTHON structure: … … 25 25 # In the C binary data structure used by the giet_vm, all objects of same type 26 26 # are stored in a linear array (one single array for all psegs for example). 27 # For all objects, we compute and store in the PYTHON object itselfa "global index"27 # For all objects, we compute and store in the PYTHON object a "global index" 28 28 # corresponding to the index in this global array, and this index can be used as 29 29 # a pseudo-pointer to identify a specific object of a given type. 30 ################################################################################### #####31 32 ################################################################################### #####30 ################################################################################### 31 32 ################################################################################### 33 33 # Various constants 34 ################################################################################### #####34 ################################################################################### 35 35 36 36 PADDR_WIDTH = 40 # number of bits for physical address … … 38 38 Y_WIDTH = 4 # number of bits encoding y coordinate 39 39 P_WIDTH = 4 # number of bits encoding local proc_id 40 VPN_ANTI_MASK = 0x00000FFF # mask v irtual address to get offset in asmall page41 BPN_MASK = 0xFFE00000 # mask v irtual address to get the BPN (big page)42 PERI_INCREMENT = 0x10000 # virtual address increment for replicated lvsegs40 VPN_ANTI_MASK = 0x00000FFF # mask vaddr to get offset in small page 41 BPN_MASK = 0xFFE00000 # mask vaddr to get the BPN in big page 42 PERI_INCREMENT = 0x10000 # virtual address increment for replicated vsegs 43 43 RESET_ADDRESS = 0xBFC00000 # Processor wired boot_address 44 MAPPING_SIGNATURE = 0xDACE2014 # Magic number indicating a valid C binary struture45 46 ################################################################################### #####44 MAPPING_SIGNATURE = 0xDACE2014 # Magic number indicating a valid C BLOB 45 46 ################################################################################### 47 47 # These lists must be consistent with values defined in 48 48 # mapping_info.h / xml_driver.c /xml_parser.c 49 ################################################################################### #####49 ################################################################################### 50 50 PERIPHTYPES = [ 51 51 'CMA', … … 78 78 ] 79 79 80 ################################################################################### ###80 ################################################################################### 81 81 # These lists must be consistent with values defined in 82 82 # irq_handler.c / irq_handler.h / xml_driver.c / xml_parser.c 83 ################################################################################### ###83 ################################################################################### 84 84 IRQTYPES = [ 85 85 'HWI', … … 145 145 ] 146 146 147 ################################################################################### ####147 ################################################################################### 148 148 class Mapping( object ): 149 ################################################################################### ####149 ################################################################################### 150 150 def __init__( self, 151 151 name, # mapping name … … 165 165 reset_address = RESET_ADDRESS, # Processor wired boot_address 166 166 ram_base = 0, # RAM physical base in cluster[0,0] 167 ram_size = 0 ): # RAM size in eachcluster (bytes)167 ram_size = 0 ): # RAM size per cluster (bytes) 168 168 169 169 assert ( x_size <= (1<<X_WIDTH) ) … … 606 606 # end of cbin() 607 607 608 ####################################################################### ###########609 def giet_vsegs( self ): # compute string for giet_vsegs.ld file generation608 ####################################################################### 609 def giet_vsegs( self ): # compute string for giet_vsegs.ld file 610 610 # required by giet_vm compilation 611 611 … … 619 619 for vseg in self.globs: 620 620 621 if ( vseg.name == 'seg_boot_code' ):621 if ( vseg.name[0:13] == 'seg_boot_code' ): 622 622 boot_code_vbase = vseg.vbase 623 623 boot_code_size = vseg.length 624 624 boot_code_found = True 625 625 626 if ( vseg.name == 'seg_boot_data' ):626 if ( vseg.name[0:13] == 'seg_boot_data' ): 627 627 boot_data_vbase = vseg.vbase 628 628 boot_data_size = vseg.length 629 629 boot_data_found = True 630 630 631 if ( vseg.name == 'seg_kernel_data' ):631 if ( vseg.name[0:15] == 'seg_kernel_data' ): 632 632 kernel_data_vbase = vseg.vbase 633 633 kernel_data_size = vseg.length 634 634 kernel_data_found = True 635 635 636 if ( vseg.name == 'seg_kernel_code' ):636 if ( vseg.name[0:15] == 'seg_kernel_code' ): 637 637 kernel_code_vbase = vseg.vbase 638 638 kernel_code_size = vseg.length 639 639 kernel_code_found = True 640 640 641 if ( vseg.name == 'seg_kernel_init' ):641 if ( vseg.name[0:15] == 'seg_kernel_init' ): 642 642 kernel_init_vbase = vseg.vbase 643 643 kernel_init_size = vseg.length … … 692 692 return s 693 693 694 ###################################################################### #############695 def hard_config( self ): # compute string for hard_config.h file generation,694 ###################################################################### 695 def hard_config( self ): # compute string for hard_config.h file 696 696 # required by 697 697 # - top.cpp compilation … … 1117 1117 # end of hard_config() 1118 1118 1119 ################################################################# ###############1120 def linux_dts( self ): # compute string for linux.dts file generation1119 ################################################################# 1120 def linux_dts( self ): # compute string for linux.dts file 1121 1121 # used for linux configuration 1122 1122 # header … … 1233 1233 if ( periph.ptype == 'TTY' ): 1234 1234 1235 # get HWI index to XCU or PIC (only TTY channel0 is used by Linux)1235 # get HWI index to XCU or PIC (only TTY0 is used by Linux) 1236 1236 hwi_id = 0xFFFFFFFF 1237 1237 for irq in irq_ctrl.irqs: … … 1274 1274 1275 1275 else: 1276 print '[genmap warning] in linux_dts() : %s' % (periph.subtype), 1276 print '[genmap warning] in linux_dts() : ' 1277 print ' %s' % (periph.subtype), 1277 1278 print 'peripheral not supported by LINUX' 1278 1279 … … 1283 1284 # other peripherals 1284 1285 else: 1285 print '[genmap warning] in linux_dts() '1286 print ' 1286 print '[genmap warning] in linux_dts() : ' 1287 print ' %s peripheral not supported by LINUX' % (periph.ptype) 1287 1288 1288 1289 # clocks … … 1305 1306 1306 1307 1307 ################################################################# ############1308 def netbsd_dts( self ): # compute string for netbsd.dts file generation,1308 ################################################################# 1309 def netbsd_dts( self ): # compute string for netbsd.dts file 1309 1310 # used for netbsd configuration 1310 1311 # header … … 1322 1323 for cluster in self.clusters: 1323 1324 for proc in cluster.procs: 1324 proc_id = (((cluster.x << self.y_width) + cluster.y) << self.p_width) + proc.lpid 1325 proc_id = (((cluster.x << self.y_width) + cluster.y) 1326 << self.p_width) + proc.lpid 1325 1327 1326 1328 s += ' Mips,32@0x%x {\n' % proc_id … … 1346 1348 s += ' cached = <1>;\n' 1347 1349 s += ' device_type = "memory";\n' 1348 s += ' reg = <0x%x 0x%x 0x%x>;\n' % (msb, lsb,size)1350 s += ' reg = <0x%x 0x%x 0x%x>;\n' % (msb,lsb,size) 1349 1351 s += ' };\n' 1350 1352 … … 1366 1368 s += ' %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base) 1367 1369 s += ' device_type = "soclib:xicu:root";\n' 1368 s += ' reg = <0x%x 0x%x 0x%x>;\n' % (msb, lsb,size)1370 s += ' reg = <0x%x 0x%x 0x%x>;\n' % (msb,lsb,size) 1369 1371 s += ' input_lines = <%d>;\n' % periph.arg 1370 1372 s += ' ipis = <%d>;\n' % periph.arg … … 1430 1432 hwi_id = 0xFFFFFFFF 1431 1433 for irq in xcu.irqs: 1432 if ( (irq.isrtype == 'ISR_DMA') and (irq.channel == channel) ): 1434 if ( (irq.isrtype == 'ISR_DMA') and 1435 (irq.channel == channel) ): 1433 1436 hwi_id = irq.srcid 1434 1437 … … 1472 1475 s += ' %s@0x%x {\n' % (periph.pseg.name, periph.pseg.base) 1473 1476 s += ' device_type = "soclib:framebuffer";\n' 1474 s += ' mode = <32>;\n' 1477 s += ' mode = <32>;\n' # bits par pixel 1475 1478 s += ' width = <%d>;\n' % periph.arg 1476 1479 s += ' height = <%d>;\n' % periph.arg … … 1692 1695 # end netbsd_dts() 1693 1696 1694 ########################### 1695 def almos_archinfo( self ): # compute string for arch.info file generation,1697 ###################################################################### 1698 def almos_archinfo( self ): # compute string for arch.info file 1696 1699 # used for almos configuration 1697 1700 # header … … 1730 1733 # scan irqs 1731 1734 for irq in periph.irqs: 1732 if ( irq.isrtype == 'ISR_TTY_RX' ): tty_irq_id = irq.srcid1733 if ( irq.isrtype == 'ISR_BDV' ): bdv_irq_id = irq.srcid1734 if ( irq.isrtype == 'ISR_DMA' ): dma_irq_id = irq.srcid1735 if (irq.isrtype=='ISR_TTY_RX'): tty_irq_id = irq.srcid 1736 if (irq.isrtype=='ISR_BDV' ): bdv_irq_id = irq.srcid 1737 if (irq.isrtype=='ISR_DMA' ): dma_irq_id = irq.srcid 1735 1738 1736 1739 # Build the cluster description 1737 1740 s += '[CLUSTER]\n' 1738 1741 s += ' CID=%d\n' % cluster_id 1739 s += ' ARCH_CID=0x%x\n' % ((cluster.x << self.y_width) +cluster.y)1742 s += ' ARCH_CID=0x%x\n' % ((cluster.x<<self.y_width)+cluster.y) 1740 1743 s += ' CPU_NR=%d\n' % nb_cpus 1741 1744 s += ' DEV_NR=%d\n' % nb_devs … … 1748 1751 irqid = -1 1749 1752 s += ' DEVID=RAM' 1750 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' % ( base, size)1753 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' % (base,size) 1751 1754 1752 1755 # Handling peripherals … … 1758 1761 1759 1762 s += ' DEVID=XICU' 1760 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' % ( base, size)1763 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' %(base,size) 1761 1764 1762 1765 elif ( (periph.ptype == 'TTY') … … 1764 1767 1765 1768 s += ' DEVID=TTY' 1766 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' % ( base, size, tty_irq_id)1769 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' %(base,size,tty_irq_id) 1767 1770 1768 1771 elif ( (periph.ptype == 'DMA') … … 1770 1773 1771 1774 s += ' DEVID=DMA' 1772 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' % ( base, size, dma_irq_id)1775 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' %(base,size,dma_irq_id) 1773 1776 1774 1777 elif ( periph.ptype == 'FBF' ): 1775 1778 1776 1779 s += ' DEVID=FB' 1777 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' % ( base,size )1780 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' %(base,size ) 1778 1781 1779 1782 elif ( (periph.ptype == 'IOC') and (periph.subtype == 'BDV') … … 1781 1784 1782 1785 s += ' DEVID=BLKDEV' 1783 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' % ( base, size, bdv_irq_id)1786 s += ' BASE=0x%x SIZE=0x%x IRQ=%d\n' %(base,size,bdv_irq_id) 1784 1787 1785 1788 elif ( periph.ptype == 'PIC' ): 1786 1789 1787 1788 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' % ( base, size)1790 s += ' DEVID=IOPIC' 1791 s += ' BASE=0x%x SIZE=0x%x IRQ=-1\n' %(base,size) 1789 1792 1790 1793 else: … … 1807 1810 1808 1811 1809 ################################################################################### ########1812 ################################################################################### 1810 1813 class Cluster ( object ): 1811 ################################################################################### ########1814 ################################################################################### 1812 1815 def __init__( self, 1813 1816 x, 1814 1817 y ): 1815 1818 1816 self.index = 0 1817 self.x = x 1818 self.y = y 1819 self.psegs = [] 1820 self.procs = [] 1821 self.periphs = [] 1819 self.index = 0 # global index (set by Mapping constructor) 1820 self.x = x # x coordinate 1821 self.y = y # y coordinate 1822 self.psegs = [] # filled by addRam() or addPeriph() 1823 self.procs = [] # filled by addProc() 1824 self.periphs = [] # filled by addPeriph() 1822 1825 1823 1826 return … … 1835 1838 1836 1839 ############################################# 1837 def cbin( self, mapping, verbose, expected ): 1840 def cbin( self, mapping, verbose, expected ): # C binary structure for Cluster 1838 1841 1839 1842 if ( verbose ): … … 1843 1846 if (self.index != expected): 1844 1847 print '[genmap error] in Cluster.cbin()' 1845 print ' cluster global index = %d / expected = %d' % (self.index,expected) 1848 print ' cluster global index = %d / expected = %d' \ 1849 % (self.index,expected) 1846 1850 sys.exit(1) 1847 1851 … … 1865 1869 1866 1870 byte_stream = bytearray() 1867 byte_stream += mapping.int2bytes( 4 , self.x )# x coordinate1868 byte_stream += mapping.int2bytes( 4 , self.y )# x coordinate1869 byte_stream += mapping.int2bytes( 4 , len( self.psegs ) ) # numberpsegs in cluster1870 byte_stream += mapping.int2bytes( 4 , pseg_id ) # first psegglobal index1871 byte_stream += mapping.int2bytes( 4 , len( self.procs ) ) # numberprocs in cluster1872 byte_stream += mapping.int2bytes( 4 , proc_id ) # first procglobal index1873 byte_stream += mapping.int2bytes( 4 , len( self.periphs ) ) # numberperiphs in cluster1874 byte_stream += mapping.int2bytes( 4 , periph_id ) # first periphglobal index1871 byte_stream += mapping.int2bytes(4,self.x) # x coordinate 1872 byte_stream += mapping.int2bytes(4,self.y) # x coordinate 1873 byte_stream += mapping.int2bytes(4,len(self.psegs)) # psegs in cluster 1874 byte_stream += mapping.int2bytes(4,pseg_id ) # global index 1875 byte_stream += mapping.int2bytes(4,len(self.procs)) # procs in cluster 1876 byte_stream += mapping.int2bytes(4,proc_id ) # global index 1877 byte_stream += mapping.int2bytes(4,len(self.periphs)) # periphs in cluster 1878 byte_stream += mapping.int2bytes(4, periph_id ) # global index 1875 1879 1876 1880 if ( verbose ): … … 1884 1888 return byte_stream 1885 1889 1886 ################################################################################## ######1890 ################################################################################## 1887 1891 class Vspace( object ): 1888 ################################################################################## ######1892 ################################################################################## 1889 1893 def __init__( self, 1890 1894 name, … … 1910 1914 1911 1915 ############################################# 1912 def cbin( self, mapping, verbose, expected ): # C binary structurefor Vspace1916 def cbin( self, mapping, verbose, expected ): # C binary for Vspace 1913 1917 1914 1918 if ( verbose ): … … 1918 1922 if (self.index != expected): 1919 1923 print '[genmap error] in Vspace.cbin()' 1920 print ' vspace global index = %d / expected = %d' %(self.index,expected) 1924 print ' vspace global index = %d / expected = %d' \ 1925 %(self.index,expected) 1921 1926 sys.exit(1) 1922 1927 … … 1928 1933 if ( vseg_start_id == 0xFFFFFFFF ): 1929 1934 print '[genmap error] in Vspace.cbin()' 1930 print ' startname %s not found for vspace %s' %(self.startname,self.name) 1935 print ' startname %s not found for vspace %s' \ 1936 %(self.startname,self.name) 1931 1937 sys.exit(1) 1932 1938 … … 1940 1946 1941 1947 byte_stream = bytearray() 1942 byte_stream += mapping.str2bytes( 32, self.name) # vspace name1943 byte_stream += mapping.int2bytes( 4, vseg_start_id) # vseg start_vector1944 byte_stream += mapping.int2bytes( 4, nb_vsegs) # number of vsegs1945 byte_stream += mapping.int2bytes( 4, nb_tasks) # number of tasks1946 byte_stream += mapping.int2bytes( 4, first_vseg_id ) # first vsegglobal index1947 byte_stream += mapping.int2bytes( 4, first_task_id ) # first taskglobal index1948 byte_stream += mapping.str2bytes(32,self.name) # vspace name 1949 byte_stream += mapping.int2bytes(4, vseg_start_id) # vseg start_vector 1950 byte_stream += mapping.int2bytes(4, nb_vsegs) # number of vsegs 1951 byte_stream += mapping.int2bytes(4, nb_tasks) # number of tasks 1952 byte_stream += mapping.int2bytes(4, first_vseg_id) # global index 1953 byte_stream += mapping.int2bytes(4, first_task_id) # global index 1948 1954 1949 1955 if ( verbose ): … … 1956 1962 return byte_stream 1957 1963 1958 ################################################################################## ######1964 ################################################################################## 1959 1965 class Task( object ): 1960 ################################################################################## ######1966 ################################################################################## 1961 1967 def __init__( self, 1962 1968 name, … … 1980 1986 return 1981 1987 1982 ################ 1988 ###################################### 1983 1989 def xml( self ): # xml for one task 1984 1990 … … 1996 2002 return s 1997 2003 1998 ##################################################### 1999 def cbin( self, mapping, verbose, expected, vspace ): # C binary data structurefor Task2004 ########################################################################## 2005 def cbin( self, mapping, verbose, expected, vspace ): # C binary for Task 2000 2006 2001 2007 if ( verbose ): 2002 print '*** cbin for task %s in vspace %s' % (self.name, vspace.name) 2008 print '*** cbin for task %s in vspace %s' \ 2009 % (self.name, vspace.name) 2003 2010 2004 2011 # check index 2005 2012 if (self.index != expected): 2006 2013 print '[genmap error] in Task.cbin()' 2007 print ' task global index = %d / expected = %d' %(self.index,expected) 2014 print ' task global index = %d / expected = %d' \ 2015 %(self.index,expected) 2008 2016 sys.exit(1) 2009 2017 … … 2037 2045 2038 2046 byte_stream = bytearray() 2039 byte_stream += mapping.str2bytes( 32, self.name )# task name in vspace2040 byte_stream += mapping.int2bytes( 4, cluster_id )# cluster global index2041 byte_stream += mapping.int2bytes( 4, self.p )# processor local index2042 byte_stream += mapping.int2bytes( 4, self.trdid ) # thread localindex in vspace2043 byte_stream += mapping.int2bytes( 4, vseg_stack_id )# stack vseg local index2044 byte_stream += mapping.int2bytes( 4, vseg_heap_id )# heap vseg local index2045 byte_stream += mapping.int2bytes( 4, self.startid )# index in start vector2047 byte_stream += mapping.str2bytes(32,self.name) # task name in vspace 2048 byte_stream += mapping.int2bytes(4, cluster_id) # cluster global index 2049 byte_stream += mapping.int2bytes(4, self.p) # processor local index 2050 byte_stream += mapping.int2bytes(4, self.trdid) # thread index in vspace 2051 byte_stream += mapping.int2bytes(4, vseg_stack_id) # stack vseg local index 2052 byte_stream += mapping.int2bytes(4, vseg_heap_id) # heap vseg local index 2053 byte_stream += mapping.int2bytes(4, self.startid) # index in start vector 2046 2054 2047 2055 if ( verbose ): … … 2055 2063 return byte_stream 2056 2064 2057 ################################################################################## ######2065 ################################################################################## 2058 2066 class Vseg( object ): 2059 ################################################################################## ######2067 ################################################################################## 2060 2068 def __init__( self, 2061 2069 name, … … 2094 2102 self.local = local # only mapped in local PTAB when true 2095 2103 self.big = big # to be mapped in a big physical page 2096 self.binpath = binpath # path 2104 self.binpath = binpath # pathname for binary file (ELF or BLOB) 2097 2105 2098 2106 return 2099 2107 2100 ################ 2101 def xml( self ): # xml for onevseg2108 ################################## 2109 def xml( self ): # xml for a vseg 2102 2110 2103 2111 s = ' <vseg name="%s"' %(self.name) … … 2118 2126 return s 2119 2127 2120 ############################################# 2121 def cbin( self, mapping, verbose, expected ): # C binary structurefor Vseg2128 ##################################################################### 2129 def cbin( self, mapping, verbose, expected ): # C binary for Vseg 2122 2130 2123 2131 if ( verbose ): … … 2165 2173 2166 2174 byte_stream = bytearray() 2167 byte_stream += mapping.str2bytes( 32, self.name )# vseg name2168 byte_stream += mapping.str2bytes( 64, self.binpath )# binpath2169 byte_stream += mapping.int2bytes( 4, self.vbase )# virtual base address2170 byte_stream += mapping.int2bytes( 8, 0 )# physical base address2171 byte_stream += mapping.int2bytes( 4, self.length )# vseg size (bytes)2172 byte_stream += mapping.int2bytes( 4, pseg_id )# pseg global index2173 byte_stream += mapping.int2bytes( 4, mode_id )# CXWU flags2174 byte_stream += mapping.int2bytes( 4, vtype_id )# vseg type2175 byte_stream += mapping.int2bytes( 1, 0 )# mapped when non zero2176 byte_stream += mapping.int2bytes( 1, self.identity )# identity mapping2177 byte_stream += mapping.int2bytes( 1, self.local ) # only mappedin local PTAB2178 byte_stream += mapping.int2bytes( 1, self.big )# to be mapped in BPP2175 byte_stream += mapping.str2bytes(32,self.name ) # vseg name 2176 byte_stream += mapping.str2bytes(64,self.binpath ) # binpath 2177 byte_stream += mapping.int2bytes(4, self.vbase ) # virtual base address 2178 byte_stream += mapping.int2bytes(8, 0 ) # physical base address 2179 byte_stream += mapping.int2bytes(4, self.length ) # vseg size (bytes) 2180 byte_stream += mapping.int2bytes(4, pseg_id ) # pseg global index 2181 byte_stream += mapping.int2bytes(4, mode_id ) # CXWU flags 2182 byte_stream += mapping.int2bytes(4, vtype_id ) # vseg type 2183 byte_stream += mapping.int2bytes(1, 0 ) # mapped when non zero 2184 byte_stream += mapping.int2bytes(1, self.identity ) # identity mapping 2185 byte_stream += mapping.int2bytes(1, self.local ) # only in local PTAB 2186 byte_stream += mapping.int2bytes(1, self.big ) # to be mapped in BPP 2179 2187 2180 2188 if ( verbose ): … … 2193 2201 return byte_stream 2194 2202 2195 ################################################################################## ####2203 ################################################################################## 2196 2204 class Processor ( object ): 2197 ################################################################################## ####2205 ################################################################################## 2198 2206 def __init__( self, 2199 2207 x, … … 2208 2216 return 2209 2217 2210 ################ 2218 ######################################## 2211 2219 def xml( self ): # xml for a processor 2212 2220 return ' <proc index="%d" />\n' % (self.lpid) 2213 2221 2214 ############################################# 2215 def cbin( self, mapping, verbose, expected ): # C binary structurefor Proc2222 #################################################################### 2223 def cbin( self, mapping, verbose, expected ): # C binary for Proc 2216 2224 2217 2225 if ( verbose ): 2218 print '*** cbin for proc %d in cluster (%d,%d)' % (self.lpid, self.x, self.y) 2226 print '*** cbin for proc %d in cluster (%d,%d)' \ 2227 % (self.lpid, self.x, self.y) 2219 2228 2220 2229 # check index 2221 2230 if (self.index != expected): 2222 2231 print '[genmap error] in Proc.cbin()' 2223 print ' proc global index = %d / expected = %d' % (self.index,expected) 2232 print ' proc global index = %d / expected = %d' \ 2233 % (self.index,expected) 2224 2234 sys.exit(1) 2225 2235 … … 2229 2239 return byte_stream 2230 2240 2231 ################################################################################## ####2241 ################################################################################## 2232 2242 class Pseg ( object ): 2233 ################################################################################## ####2243 ################################################################################## 2234 2244 def __init__( self, 2235 2245 name, … … 2252 2262 return 2253 2263 2254 ################ 2264 ################################### 2255 2265 def xml( self ): # xml for a pseg 2256 2266 2257 return ' <pseg name="%s" type="%s" base="0x%x" length="0x%x" />\n' \ 2258 % (self.name, self.segtype, self.base, self.size) 2259 2260 ###################################################### 2261 def cbin( self, mapping, verbose, expected, cluster ): # C binary structure for Pseg 2267 s = ' <pseg name="%s" type="%s" base="0x%x" length="0x%x" />\n' \ 2268 % (self.name, self.segtype, self.base, self.size) 2269 return s 2270 2271 ########################################################################### 2272 def cbin( self, mapping, verbose, expected, cluster ): # C binary for Pseg 2262 2273 2263 2274 if ( verbose ): … … 2268 2279 if (self.index != expected): 2269 2280 print '[genmap error] in Pseg.cbin()' 2270 print ' pseg global index = %d / expected = %d' % (self.index,expected) 2281 print ' pseg global index = %d / expected = %d' \ 2282 % (self.index,expected) 2271 2283 sys.exit(1) 2272 2284 … … 2282 2294 2283 2295 byte_stream = bytearray() 2284 byte_stream += mapping.str2bytes( 32, self.name )# pseg name2285 byte_stream += mapping.int2bytes( 8 , self.base )# physical base address2286 byte_stream += mapping.int2bytes( 8 , self.size )# segment length2287 byte_stream += mapping.int2bytes( 4 , segtype_int )# segment type2288 byte_stream += mapping.int2bytes( 4 , cluster.index )# cluster global index2289 byte_stream += mapping.int2bytes( 4 , 0 )# linked list of vsegs2296 byte_stream += mapping.str2bytes(32,self.name) # pseg name 2297 byte_stream += mapping.int2bytes(8 ,self.base) # physical base address 2298 byte_stream += mapping.int2bytes(8 ,self.size) # segment length 2299 byte_stream += mapping.int2bytes(4 ,segtype_int) # segment type 2300 byte_stream += mapping.int2bytes(4 ,cluster.index) # cluster global index 2301 byte_stream += mapping.int2bytes(4 ,0) # linked list of vsegs 2290 2302 2291 2303 if ( verbose ): … … 2296 2308 return byte_stream 2297 2309 2298 ################################################################################## ####2310 ################################################################################## 2299 2311 class Periph ( object ): 2300 ################################################################################## ####2312 ################################################################################## 2301 2313 def __init__( self, 2302 2314 pseg, # associated pseg … … 2304 2316 subtype = 'NONE', # peripheral subtype 2305 2317 channels = 1, # for multi-channels peripherals 2306 arg0 = 0, # optional argument(semantic depends on ptype)2307 arg1 = 0, # optional argument(semantic depends on ptype)2308 arg2 = 0, # optional argument(semantic depends on ptype)2309 arg3 = 0 ): # optional argument(semantic depends on ptype)2318 arg0 = 0, # optional (semantic depends on ptype) 2319 arg1 = 0, # optional (semantic depends on ptype) 2320 arg2 = 0, # optional (semantic depends on ptype) 2321 arg3 = 0 ): # optional (semantic depends on ptype) 2310 2322 2311 2323 self.index = 0 # global index ( set by addPeriph() ) … … 2321 2333 return 2322 2334 2323 ################ 2335 ###################################### 2324 2336 def xml( self ): # xml for a periph 2325 2337 … … 2340 2352 return s 2341 2353 2342 ############################################# 2343 def cbin( self, mapping, verbose, expected ): # C binary structurefor Periph2354 ###################################################################### 2355 def cbin( self, mapping, verbose, expected ): # C binary for Periph 2344 2356 2345 2357 if ( verbose ): … … 2350 2362 if (self.index != expected): 2351 2363 print '[genmap error] in Periph.cbin()' 2352 print ' periph global index = %d / expected = %d' % (self.index,expected) 2364 print ' periph global index = %d / expected = %d' \ 2365 % (self.index,expected) 2353 2366 sys.exit(1) 2354 2367 … … 2382 2395 2383 2396 byte_stream = bytearray() 2384 byte_stream += mapping.int2bytes( 4 , ptype_id )# peripheral type2385 byte_stream += mapping.int2bytes( 4 , subtype_id )# peripheral subtype2386 byte_stream += mapping.int2bytes( 4 , pseg_id )# pseg global index2387 byte_stream += mapping.int2bytes( 4 , self.channels )# number of channels2388 byte_stream += mapping.int2bytes( 4 , self.arg0 )# optionnal arg02389 byte_stream += mapping.int2bytes( 4 , self.arg1 )# optionnal arg12390 byte_stream += mapping.int2bytes( 4 , self.arg2 )# optionnal arg22391 byte_stream += mapping.int2bytes( 4 , self.arg3 )# optionnal arg32392 byte_stream += mapping.int2bytes( 4 , len( self.irqs )) # number of input irqs2393 byte_stream += mapping.int2bytes( 4 , irq_id ) # first irqglobal index2397 byte_stream += mapping.int2bytes(4,ptype_id) # peripheral type 2398 byte_stream += mapping.int2bytes(4,subtype_id) # peripheral subtype 2399 byte_stream += mapping.int2bytes(4,pseg_id) # pseg global index 2400 byte_stream += mapping.int2bytes(4,self.channels) # number of channels 2401 byte_stream += mapping.int2bytes(4,self.arg0) # optionnal arg0 2402 byte_stream += mapping.int2bytes(4,self.arg1) # optionnal arg1 2403 byte_stream += mapping.int2bytes(4,self.arg2) # optionnal arg2 2404 byte_stream += mapping.int2bytes(4,self.arg3) # optionnal arg3 2405 byte_stream += mapping.int2bytes(4,len(self.irqs)) # number of input irqs 2406 byte_stream += mapping.int2bytes( 4 , irq_id ) # global index 2394 2407 2395 2408 if ( verbose ): … … 2401 2414 return byte_stream 2402 2415 2403 ################################################################################## ####2416 ################################################################################## 2404 2417 class Irq ( object ): 2405 ################################################################################## ####2418 ################################################################################## 2406 2419 def __init__( self, 2407 2420 irqtype, # input IRQ type : HWI / WTI / PTI (for XCU only) … … 2421 2434 return 2422 2435 2423 ################ 2436 ################################ 2424 2437 def xml( self ): # xml for Irq 2425 2438 2426 return' <irq srctype="%s" srcid="%d" isr="%s" channel="%d" />\n' \2439 s = ' <irq srctype="%s" srcid="%d" isr="%s" channel="%d" />\n' \ 2427 2440 % ( self.irqtype, self.srcid, self.isrtype, self.channel ) 2428 2429 ############################################# 2430 def cbin( self, mapping, verbose, expected ): # C binary structure for Irq 2441 return s 2442 2443 #################################################################### 2444 def cbin( self, mapping, verbose, expected ): # C binary for Irq 2431 2445 2432 2446 if ( verbose ): … … 2436 2450 if (self.index != expected): 2437 2451 print '[genmap error] in Irq.cbin()' 2438 print ' irq global index = %d / expected = %d' % (self.index,expected) 2452 print ' irq global index = %d / expected = %d' \ 2453 % (self.index,expected) 2439 2454 sys.exit(1) 2440 2455
Note: See TracChangeset
for help on using the changeset viewer.