Changes between Version 2 and Version 3 of MjpegCourse/ClusteredNoirqMulti


Ignore:
Timestamp:
Mar 4, 2008, 7:41:27 PM (16 years ago)
Author:
Nicolas Pouillon
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • MjpegCourse/ClusteredNoirqMulti

    v2 v3  
    44#!/usr/bin/env python
    55
    6 from dsx.hardware import *
    7 from soclib import *
     6import soclib
    87
    9 class ClusteredNoirqMulti(SoclibGenericArchitecture):
    10     """
    11     Parameters:
    12      - min_latency: Vgmn's latency
    13      - cpus: Cpus per cluster in a list
    14      - rams: Rams per cluster in a list
     8def _cluster(arch, no,
     9                         with_gdb,
     10                         ncpu, nram,
     11                         icache_lines, icache_words,
     12                         dcache_lines, dcache_words):
     13        crossbar = arch.create('caba:vci_local_crossbar', 'lc%d'%no)
    1514
    16     Exports:
    17      - vgmn: global vgmn interconnect
    18      - clust[]: cluster's interconnect; contains:
    19        - cpu[]: cpu list for cluster
    20        - cram[]: cached ram list for cluster
    21        - uram[]: uncached ram list for cluster
    22        - locks: ramlocks
    23      - cpu[]: global cpu list
    24      - cram[]: global cached ram list
    25      - uram[]: global uncached ram list
    26      - locks: global ramlocks list
    27     """
    28     def cluster(self, clustno, ncpu, nram):
    29         ic = LocalCrossbar('lc%d'%clustno)
     15        for i in range(ncpu):
     16                cn = arch.cpu_num
     17                arch.cpu_num += 1
     18                if with_gdb:
     19                        mips = arch.create('caba:iss_wrapper', 'mips%d_%d'%(no,i), iss_t='common:gdb_iss', gdb_iss_t = 'common:mipsel', ident = cn)
     20                else:
     21                        mips = arch.create('caba:iss_wrapper', 'mips%d_%d'%(no,i), iss_t='common:mipsel', ident = cn)
     22                xcache = arch.create('caba:vci_xcache', 'xcache%d_%d'%(no,i),
     23                                                   icache_lines = icache_lines,
     24                                                   icache_words = icache_words,
     25                                                   dcache_lines = dcache_lines,
     26                                                   dcache_words = dcache_words)
     27                mips.dcache // xcache.dcache
     28                mips.icache // xcache.icache
    3029
    31         cpu = []
    32         cache = []
    33         for n in range(ncpu):
    34             c = Mips('mips%d_%d'%(clustno,n))
    35             xc = Xcache('cache%d_%d'%(clustno,n))
    36             c.cache // xc.cache
     30                crossbar.to_initiator.new() // xcache.vci
    3731
    38             cpu.append(c)
    39             cache.append(xc)
     32        for i in range(2):
     33                ram = arch.create('caba:vci_ram', 'ram%d_%d'%(no,i))
     34                base = 0x10000000*(1+no)+0x1000000*i
     35                ram.addSegment('cram%d_%d'%(no,i), base, 0x100000, True)
     36                ram.addSegment('uram%d_%d'%(no,i), base + 0x200000, 0x100000, False)
     37                ram.vci // crossbar.to_target.new()
     38                if i == 0 and no == 0:
     39                        ram.addSegment('boot', 0xbfc00000, 0x800,True)
     40                        ram.addSegment('excep', 0x80000080, 0x800,True)
     41        return crossbar
    4042
    41             xc.vci // ic.getTarget()
     43def ClusteredNoirqMulti(
     44        nbcpu = [1],
     45        nbram = [1],
     46        with_gdb = False,
     47        icache_lines = 32,
     48        icache_words = 8,
     49        dcache_lines = 32,
     50        dcache_words = 8 ):
     51        arch = soclib.Architecture(
     52                                                 cell_size = 4,
     53                                                 plen_size = 1,
     54                                                 addr_size = 32,
     55                                                 rerror_size = 1,
     56                                                 clen_size = 1,
     57                                                 rflag_size = 1,
     58                                                 srcid_size = 8,
     59                                                 pktid_size = 1,
     60                                                 trdid_size = 1,
     61                                                 wrplen_size = 1
     62                                                 )
     63        arch.cpu_num = 0
    4264
    43         ic.cpu = cpu
    44         ic.cache = cache
     65        arch.create('common:mapping_table',
     66                          'mapping_table',
     67                          addr_bits = [5,3],
     68                          srcid_bits = [4,4],
     69                          cacheability_mask = 0xc00000)
     70        arch.create('common:elf_loader', 'loader')
    4571
    46         ram = []
    47         uram = []
    48         cram = []
    49         for n in range(nram):
    50             cr = Segment('cram%d'%clustno, __remplir__)
    51             ur = Segment('uram%d'%clustno, __remplir__)
    52             uram.append(ur)
    53             cram.append(cr)
    54             r = MultiRam('ram%d'%clustno, cr, ur)
     72        vgmn = arch.create('caba:vci_vgmn', 'vgmn0', min_latency = 2, fifo_depth = 8)
    5573
    56             r.vci // ic.getInit()
    57             ram.append(r)
    58         ic.ram = ram
    59         ic.uram = uram
    60         ic.cram = cram
     74        for no, ncpu, nram in zip(range(len(nbcpu)), nbcpu, nbram):
     75                lc = _cluster(
     76                        arch, no,
     77                        with_gdb = with_gdb,
     78                        ncpu = ncpu, nram = nram,
     79                        icache_lines = icache_lines, icache_words = icache_words,
     80                        dcache_lines = dcache_lines, dcache_words = dcache_words)
     81                vgmn.to_initiator.new() // lc.initiator_to_up
     82                vgmn.to_target.new() // lc.target_to_up
    6183
    62         ic.locks = Locks('locks%d'%clustno)
    63         ic.locks.vci // ic.getInit()
    64        
    65         return ic
     84        tty = arch.create('caba:vci_multi_tty', 'tty', names = ['tty0'])
     85        tty.addSegment('tty', 0x95000000, 0x20, False)
     86        tty.vci // lc.to_target.new()
    6687
    67     def architecture(self):
    68         self.vgmn = Vgmn('vgmn', self.getParam(__remplir__))
    69         self.setBase(self.vgmn)
    70 
    71         nram = self.getParam('rams')
    72         ncpu = self.getParam('cpus')
    73         assert(len(nram) == len(ncpu))
    74 
    75         ncluster = len(nram)
    76 
    77         self.clust = []
    78         for n, nc, nr in zip(range(ncluster), ncpu, nram):
    79             ic = self.cluster(n, nc, nr)
    80             self.clust.append(ic)
    81             ic.__remplir__ // self.vgmn.getBoth()
    82        
    83         self.clust[0].ram[0].addSegment(
    84             Segment('reset', Cached, addr=0xbfc00000),
    85             Segment('excep', Cached, addr=0x80000080))
    86 
    87         # export global lists
    88         add = lambda x,y: x+y
    89         self.ram = reduce(add, [self.clust[i].ram for i in range(ncluster)])
    90         self.uram = reduce(add, [self.clust[i].uram for i in range(ncluster)])
    91         self.cram = reduce(add, [self.clust[i].cram for i in range(ncluster)])
    92         self.cpu = reduce(add, [self.clust[i].cpu for i in range(ncluster)])
    93         self.locks = [self.clust[i].locks for i in range(ncluster)]
    94 
    95 # Ceci permet de tester l'architecture:
    96 # Le bout de code dans le if ne sera exécuté que si vous faites ./clustered_noirq_multi.py
    97 # et pas si vous importez clustered_noirq_multi depuis une autre description.
    98 
    99 if __name__ == '__main__':
    100     hard = ClusteredNoirqMulti( cpus = [1, 2, 2, 1],
    101                                 rams = [1, 1, 1, 1],
    102                                 min_latency = 10 )
    103     hard.dispTree()
    104     print hard.cpu
    105     print hard.ram
    106     print hard.cram
    107     print hard.uram
    108     print hard.locks
    109     hard.generate(Caba())
     88        return arch
    11089}}}