configs: Refactor BaseSimpleSystem in devices.py
We define a new parent (ClusterSystem) to model a system with one or more cpu clusters within it. The idea is to make this new base class reusable by SE systems/scripts as well (like starter_se.py) Change-Id: I1398d773813db565f6ad5ce62cb4c022cb12a55a Signed-off-by: Giacomo Travaglini <giacomo.travaglini@arm.com> Reviewed-by: Richard Cooper <richard.cooper@arm.com>
This commit is contained in:
@@ -338,56 +338,15 @@ class FastmodelCluster(CpuCluster):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class BaseSimpleSystem(ArmSystem):
|
class ClusterSystem:
|
||||||
cache_line_size = 64
|
"""
|
||||||
|
Base class providing cpu clusters generation/handling methods to
|
||||||
def __init__(self, mem_size, platform, **kwargs):
|
SE/FS systems
|
||||||
super(BaseSimpleSystem, self).__init__(**kwargs)
|
"""
|
||||||
|
|
||||||
self.voltage_domain = VoltageDomain(voltage="1.0V")
|
|
||||||
self.clk_domain = SrcClockDomain(
|
|
||||||
clock="1GHz", voltage_domain=Parent.voltage_domain
|
|
||||||
)
|
|
||||||
|
|
||||||
if platform is None:
|
|
||||||
self.realview = VExpress_GEM5_V1()
|
|
||||||
else:
|
|
||||||
self.realview = platform
|
|
||||||
|
|
||||||
if hasattr(self.realview.gic, "cpu_addr"):
|
|
||||||
self.gic_cpu_addr = self.realview.gic.cpu_addr
|
|
||||||
|
|
||||||
self.terminal = Terminal()
|
|
||||||
self.vncserver = VncServer()
|
|
||||||
|
|
||||||
self.iobus = IOXBar()
|
|
||||||
# Device DMA -> MEM
|
|
||||||
self.mem_ranges = self.getMemRanges(int(Addr(mem_size)))
|
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
self._clusters = []
|
self._clusters = []
|
||||||
|
|
||||||
def getMemRanges(self, mem_size):
|
|
||||||
"""
|
|
||||||
Define system memory ranges. This depends on the physical
|
|
||||||
memory map provided by the realview platform and by the memory
|
|
||||||
size provided by the user (mem_size argument).
|
|
||||||
The method is iterating over all platform ranges until they cover
|
|
||||||
the entire user's memory requirements.
|
|
||||||
"""
|
|
||||||
mem_ranges = []
|
|
||||||
for mem_range in self.realview._mem_regions:
|
|
||||||
size_in_range = min(mem_size, mem_range.size())
|
|
||||||
|
|
||||||
mem_ranges.append(
|
|
||||||
AddrRange(start=mem_range.start, size=size_in_range)
|
|
||||||
)
|
|
||||||
|
|
||||||
mem_size -= size_in_range
|
|
||||||
if mem_size == 0:
|
|
||||||
return mem_ranges
|
|
||||||
|
|
||||||
raise ValueError("memory size too big for platform capabilities")
|
|
||||||
|
|
||||||
def numCpuClusters(self):
|
def numCpuClusters(self):
|
||||||
return len(self._clusters)
|
return len(self._clusters)
|
||||||
|
|
||||||
@@ -423,6 +382,56 @@ class BaseSimpleSystem(ArmSystem):
|
|||||||
cluster.connectMemSide(cluster_mem_bus)
|
cluster.connectMemSide(cluster_mem_bus)
|
||||||
|
|
||||||
|
|
||||||
|
class BaseSimpleSystem(ArmSystem, ClusterSystem):
|
||||||
|
cache_line_size = 64
|
||||||
|
|
||||||
|
def __init__(self, mem_size, platform, **kwargs):
|
||||||
|
ArmSystem.__init__(self, **kwargs)
|
||||||
|
ClusterSystem.__init__(self, **kwargs)
|
||||||
|
|
||||||
|
self.voltage_domain = VoltageDomain(voltage="1.0V")
|
||||||
|
self.clk_domain = SrcClockDomain(
|
||||||
|
clock="1GHz", voltage_domain=Parent.voltage_domain
|
||||||
|
)
|
||||||
|
|
||||||
|
if platform is None:
|
||||||
|
self.realview = VExpress_GEM5_V1()
|
||||||
|
else:
|
||||||
|
self.realview = platform
|
||||||
|
|
||||||
|
if hasattr(self.realview.gic, "cpu_addr"):
|
||||||
|
self.gic_cpu_addr = self.realview.gic.cpu_addr
|
||||||
|
|
||||||
|
self.terminal = Terminal()
|
||||||
|
self.vncserver = VncServer()
|
||||||
|
|
||||||
|
self.iobus = IOXBar()
|
||||||
|
# Device DMA -> MEM
|
||||||
|
self.mem_ranges = self.getMemRanges(int(Addr(mem_size)))
|
||||||
|
|
||||||
|
def getMemRanges(self, mem_size):
|
||||||
|
"""
|
||||||
|
Define system memory ranges. This depends on the physical
|
||||||
|
memory map provided by the realview platform and by the memory
|
||||||
|
size provided by the user (mem_size argument).
|
||||||
|
The method is iterating over all platform ranges until they cover
|
||||||
|
the entire user's memory requirements.
|
||||||
|
"""
|
||||||
|
mem_ranges = []
|
||||||
|
for mem_range in self.realview._mem_regions:
|
||||||
|
size_in_range = min(mem_size, mem_range.size())
|
||||||
|
|
||||||
|
mem_ranges.append(
|
||||||
|
AddrRange(start=mem_range.start, size=size_in_range)
|
||||||
|
)
|
||||||
|
|
||||||
|
mem_size -= size_in_range
|
||||||
|
if mem_size == 0:
|
||||||
|
return mem_ranges
|
||||||
|
|
||||||
|
raise ValueError("memory size too big for platform capabilities")
|
||||||
|
|
||||||
|
|
||||||
class SimpleSystem(BaseSimpleSystem):
|
class SimpleSystem(BaseSimpleSystem):
|
||||||
"""
|
"""
|
||||||
Meant to be used with the classic memory model
|
Meant to be used with the classic memory model
|
||||||
|
|||||||
Reference in New Issue
Block a user