MEM: Introduce the master/slave port roles in the Python classes
authorAndreas Hansson <andreas.hansson@arm.com>
Mon, 13 Feb 2012 11:43:09 +0000 (06:43 -0500)
committerAndreas Hansson <andreas.hansson@arm.com>
Mon, 13 Feb 2012 11:43:09 +0000 (06:43 -0500)
This patch classifies all ports in Python as either Master or Slave
and enforces a binding of master to slave. Conceptually, a master (such
as a CPU or DMA port) issues requests, and receives responses, and
conversely, a slave (such as a memory or a PIO device) receives
requests and sends back responses. Currently there is no
differentiation between coherent and non-coherent masters and slaves.

The classification as master/slave also involves splitting the dual
role port of the bus into a master and slave port and updating all the
system assembly scripts to use the appropriate port. Similarly, the
interrupt devices have to have their int_port split into a master and
slave port. The intdev and its children have minimal changes to
facilitate the extra port.

Note that this patch does not enforce any port typing in the C++
world, it merely ensures that the Python objects have a notion of the
port roles and are connected in an appropriate manner. This check is
carried when two ports are connected, e.g. bus.master =
memory.port. The following patches will make use of the
classifications and specialise the C++ ports into masters and slaves.

65 files changed:
configs/common/CacheConfig.py
configs/common/FSConfig.py
configs/example/fs.py
configs/example/ruby_fs.py
configs/example/se.py
configs/ruby/Ruby.py
src/arch/arm/ArmTLB.py
src/arch/x86/X86LocalApic.py
src/arch/x86/X86TLB.py
src/arch/x86/interrupts.hh
src/cpu/BaseCPU.py
src/cpu/simple/AtomicSimpleCPU.py
src/cpu/testers/directedtest/RubyDirectedTester.py
src/cpu/testers/memtest/MemTest.py
src/cpu/testers/networktest/NetworkTest.py
src/cpu/testers/rubytest/RubyTester.py
src/dev/Device.py
src/dev/Ethernet.py
src/dev/Pci.py
src/dev/alpha/Tsunami.py
src/dev/arm/RealView.py
src/dev/x86/I82094AA.py
src/dev/x86/Pc.py
src/dev/x86/SouthBridge.py
src/dev/x86/i82094aa.hh
src/dev/x86/intdev.hh
src/mem/Bridge.py
src/mem/Bus.py
src/mem/PhysicalMemory.py
src/mem/cache/BaseCache.py
src/mem/ruby/system/RubyPort.cc
src/mem/ruby/system/Sequencer.py
src/python/m5/SimObject.py
src/python/m5/params.py
src/sim/System.py
tests/configs/inorder-timing.py
tests/configs/memtest-ruby.py
tests/configs/memtest.py
tests/configs/o3-timing-mp-ruby.py
tests/configs/o3-timing-mp.py
tests/configs/o3-timing-ruby.py
tests/configs/o3-timing.py
tests/configs/pc-o3-timing.py
tests/configs/pc-simple-atomic.py
tests/configs/pc-simple-timing.py
tests/configs/realview-o3-dual.py
tests/configs/realview-o3.py
tests/configs/realview-simple-atomic-dual.py
tests/configs/realview-simple-atomic.py
tests/configs/realview-simple-timing-dual.py
tests/configs/realview-simple-timing.py
tests/configs/rubytest-ruby.py
tests/configs/simple-atomic-mp-ruby.py
tests/configs/simple-atomic-mp.py
tests/configs/simple-atomic.py
tests/configs/simple-timing-mp.py
tests/configs/simple-timing.py
tests/configs/tsunami-inorder.py
tests/configs/tsunami-o3-dual.py
tests/configs/tsunami-o3.py
tests/configs/tsunami-simple-atomic-dual.py
tests/configs/tsunami-simple-atomic.py
tests/configs/tsunami-simple-timing-dual.py
tests/configs/tsunami-simple-timing.py
tests/configs/twosys-tsunami-simple-atomic.py

index 364b20f28365c5c1173134558403d91ad44905ea..720eb9f565ed4c1b6dd6743355a4f0916a59e2f9 100644 (file)
@@ -44,8 +44,8 @@ def config_cache(options, system):
                                 block_size=options.cacheline_size)
 
         system.tol2bus = Bus()
-        system.l2.cpu_side = system.tol2bus.port
-        system.l2.mem_side = system.membus.port
+        system.l2.cpu_side = system.tol2bus.master
+        system.l2.mem_side = system.membus.slave
         system.l2.num_cpus = options.num_cpus
 
     for i in xrange(options.num_cpus):
index c14eb38f0c7b5fed08345e4142885de3039e6760..8e694b8c147eaa1f93b92e95790fb2e257682748 100644 (file)
@@ -74,21 +74,21 @@ def makeLinuxAlphaSystem(mem_mode, mdesc = None):
     self.bridge = Bridge(delay='50ns', nack_delay='4ns',
                          ranges = [AddrRange(IO_address_space_base, Addr.max)])
     self.physmem = PhysicalMemory(range = AddrRange(mdesc.mem()))
-    self.bridge.master = self.iobus.port
-    self.bridge.slave = self.membus.port
-    self.physmem.port = self.membus.port
+    self.bridge.master = self.iobus.slave
+    self.bridge.slave = self.membus.master
+    self.physmem.port = self.membus.master
     self.disk0 = CowIdeDisk(driveID='master')
     self.disk2 = CowIdeDisk(driveID='master')
     self.disk0.childImage(mdesc.disk())
     self.disk2.childImage(disk('linux-bigswap2.img'))
     self.tsunami = BaseTsunami()
     self.tsunami.attachIO(self.iobus)
-    self.tsunami.ide.pio = self.iobus.port
-    self.tsunami.ide.config = self.iobus.port
-    self.tsunami.ide.dma = self.iobus.port
-    self.tsunami.ethernet.pio = self.iobus.port
-    self.tsunami.ethernet.config = self.iobus.port
-    self.tsunami.ethernet.dma = self.iobus.port
+    self.tsunami.ide.pio = self.iobus.master
+    self.tsunami.ide.config = self.iobus.master
+    self.tsunami.ide.dma = self.iobus.slave
+    self.tsunami.ethernet.pio = self.iobus.master
+    self.tsunami.ethernet.config = self.iobus.master
+    self.tsunami.ethernet.dma = self.iobus.slave
     self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
                                                read_only = True))
     self.intrctrl = IntrControl()
@@ -99,7 +99,7 @@ def makeLinuxAlphaSystem(mem_mode, mdesc = None):
     self.console = binary('console')
     self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
 
-    self.system_port = self.membus.port
+    self.system_port = self.membus.slave
 
     return self
 
@@ -124,7 +124,7 @@ def makeLinuxAlphaRubySystem(mem_mode, mdesc = None):
     # RubyPort currently does support functional accesses.  Therefore provide
     # the piobus a direct connection to physical memory
     #
-    self.piobus.port = physmem.port
+    self.piobus.master_port = physmem.port
 
     self.disk0 = CowIdeDisk(driveID='master')
     self.disk2 = CowIdeDisk(driveID='master')
@@ -132,12 +132,12 @@ def makeLinuxAlphaRubySystem(mem_mode, mdesc = None):
     self.disk2.childImage(disk('linux-bigswap2.img'))
     self.tsunami = BaseTsunami()
     self.tsunami.attachIO(self.piobus)
-    self.tsunami.ide.pio = self.piobus.port
-    self.tsunami.ide.config = self.piobus.port
-    self.tsunami.ide.dma = self.piobus.port
-    self.tsunami.ethernet.pio = self.piobus.port
-    self.tsunami.ethernet.config = self.piobus.port
-    self.tsunami.ethernet.dma = self.piobus.port
+    self.tsunami.ide.pio = self.piobus.master
+    self.tsunami.ide.config = self.piobus.master
+    self.tsunami.ide.dma = self.piobus.slave
+    self.tsunami.ethernet.pio = self.piobus.master
+    self.tsunami.ethernet.config = self.piobus.master
+    self.tsunami.ethernet.dma = self.piobus.slave
 
     #
     # Store the dma devices for later connection to dma ruby ports.
@@ -182,18 +182,18 @@ def makeSparcSystem(mem_mode, mdesc = None):
     self.t1000.attachIO(self.iobus)
     self.physmem = PhysicalMemory(range = AddrRange(Addr('1MB'), size = '64MB'), zero = True)
     self.physmem2 = PhysicalMemory(range = AddrRange(Addr('2GB'), size ='256MB'), zero = True)
-    self.bridge.master = self.iobus.port
-    self.bridge.slave = self.membus.port
-    self.physmem.port = self.membus.port
-    self.physmem2.port = self.membus.port
-    self.rom.port = self.membus.port
-    self.nvram.port = self.membus.port
-    self.hypervisor_desc.port = self.membus.port
-    self.partition_desc.port = self.membus.port
+    self.bridge.master = self.iobus.slave
+    self.bridge.slave = self.membus.master
+    self.physmem.port = self.membus.master
+    self.physmem2.port = self.membus.master
+    self.rom.port = self.membus.master
+    self.nvram.port = self.membus.master
+    self.hypervisor_desc.port = self.membus.master
+    self.partition_desc.port = self.membus.master
     self.intrctrl = IntrControl()
     self.disk0 = CowMmDisk()
     self.disk0.childImage(disk('disk.s10hw2'))
-    self.disk0.pio = self.iobus.port
+    self.disk0.pio = self.iobus.master
 
     # The puart0 and hvuart are placed on the IO bus, so create ranges
     # for them. The remaining IO range is rather fragmented, so poke
@@ -220,7 +220,7 @@ def makeSparcSystem(mem_mode, mdesc = None):
     self.hypervisor_desc_bin = binary('1up-hv.bin')
     self.partition_desc_bin = binary('1up-md.bin')
 
-    self.system_port = self.membus.port
+    self.system_port = self.membus.slave
 
     return self
 
@@ -241,8 +241,8 @@ def makeArmSystem(mem_mode, machine_type, mdesc = None, bare_metal=False):
     self.membus = MemBus(bus_id=1)
     self.membus.badaddr_responder.warn_access = "warn"
     self.bridge = Bridge(delay='50ns', nack_delay='4ns')
-    self.bridge.master = self.iobus.port
-    self.bridge.slave = self.membus.port
+    self.bridge.master = self.iobus.slave
+    self.bridge.slave = self.membus.master
 
     self.mem_mode = mem_mode
 
@@ -285,7 +285,7 @@ def makeArmSystem(mem_mode, machine_type, mdesc = None, bare_metal=False):
                                       zero = True)
         self.nvmem = PhysicalMemory(range = AddrRange(Addr('2GB'),
                                     size = '64MB'), zero = True)
-        self.nvmem.port = self.membus.port
+        self.nvmem.port = self.membus.master
         self.boot_loader = binary('boot.arm')
         self.boot_loader_mem = self.nvmem
         self.gic_cpu_addr = self.realview.gic.cpu_addr
@@ -295,14 +295,14 @@ def makeArmSystem(mem_mode, machine_type, mdesc = None, bare_metal=False):
             boot_flags += " init=/init "
         self.boot_osflags = boot_flags
 
-    self.physmem.port = self.membus.port
+    self.physmem.port = self.membus.master
     self.realview.attachOnChipIO(self.membus, self.bridge)
     self.realview.attachIO(self.iobus)
     self.intrctrl = IntrControl()
     self.terminal = Terminal()
     self.vncserver = VncServer()
 
-    self.system_port = self.membus.port
+    self.system_port = self.membus.slave
 
     return self
 
@@ -322,21 +322,21 @@ def makeLinuxMipsSystem(mem_mode, mdesc = None):
     self.membus = MemBus(bus_id=1)
     self.bridge = Bridge(delay='50ns', nack_delay='4ns')
     self.physmem = PhysicalMemory(range = AddrRange('1GB'))
-    self.bridge.master = self.iobus.port
-    self.bridge.slave = self.membus.port
-    self.physmem.port = self.membus.port
+    self.bridge.master = self.iobus.slave
+    self.bridge.slave = self.membus.master
+    self.physmem.port = self.membus.master
     self.disk0 = CowIdeDisk(driveID='master')
     self.disk2 = CowIdeDisk(driveID='master')
     self.disk0.childImage(mdesc.disk())
     self.disk2.childImage(disk('linux-bigswap2.img'))
     self.malta = BaseMalta()
     self.malta.attachIO(self.iobus)
-    self.malta.ide.pio = self.iobus.port
-    self.malta.ide.config = self.iobus.port
-    self.malta.ide.dma = self.iobus.port
-    self.malta.ethernet.pio = self.iobus.port
-    self.malta.ethernet.config = self.iobus.port
-    self.malta.ethernet.dma = self.iobus.port
+    self.malta.ide.pio = self.iobus.master
+    self.malta.ide.config = self.iobus.master
+    self.malta.ide.dma = self.iobus.slave
+    self.malta.ethernet.pio = self.iobus.master
+    self.malta.ethernet.config = self.iobus.master
+    self.malta.ethernet.dma = self.iobus.slave
     self.simple_disk = SimpleDisk(disk=RawDiskImage(image_file = mdesc.disk(),
                                                read_only = True))
     self.intrctrl = IntrControl()
@@ -346,7 +346,7 @@ def makeLinuxMipsSystem(mem_mode, mdesc = None):
     self.console = binary('mips/console')
     self.boot_osflags = 'root=/dev/hda1 console=ttyS0'
 
-    self.system_port = self.membus.port
+    self.system_port = self.membus.slave
 
     return self
 
@@ -362,13 +362,13 @@ def connectX86ClassicSystem(x86_sys):
     APIC_range_size = 1 << 12;
 
     x86_sys.membus = MemBus(bus_id=1)
-    x86_sys.physmem.port = x86_sys.membus.port
+    x86_sys.physmem.port = x86_sys.membus.master
 
     # North Bridge
     x86_sys.iobus = Bus(bus_id=0)
     x86_sys.bridge = Bridge(delay='50ns', nack_delay='4ns')
-    x86_sys.bridge.master = x86_sys.iobus.port
-    x86_sys.bridge.slave = x86_sys.membus.port
+    x86_sys.bridge.master = x86_sys.iobus.slave
+    x86_sys.bridge.slave = x86_sys.membus.master
     # Allow the bridge to pass through the IO APIC (two pages),
     # everything in the IO address range up to the local APIC, and
     # then the entire PCI address space and beyond
@@ -386,8 +386,8 @@ def connectX86ClassicSystem(x86_sys):
     # Create a bridge from the IO bus to the memory bus to allow access to
     # the local APIC (two pages)
     x86_sys.apicbridge = Bridge(delay='50ns', nack_delay='4ns')
-    x86_sys.apicbridge.slave = x86_sys.iobus.port
-    x86_sys.apicbridge.master = x86_sys.membus.port
+    x86_sys.apicbridge.slave = x86_sys.iobus.master
+    x86_sys.apicbridge.master = x86_sys.membus.slave
     x86_sys.apicbridge.ranges = [AddrRange(interrupts_address_space_base,
                                            interrupts_address_space_base +
                                            APIC_range_size - 1)]
@@ -395,7 +395,7 @@ def connectX86ClassicSystem(x86_sys):
     # connect the io bus
     x86_sys.pc.attachIO(x86_sys.iobus)
 
-    x86_sys.system_port = x86_sys.membus.port
+    x86_sys.system_port = x86_sys.membus.slave
 
 def connectX86RubySystem(x86_sys):
     # North Bridge
@@ -406,7 +406,7 @@ def connectX86RubySystem(x86_sys):
     # RubyPort currently does support functional accesses.  Therefore provide
     # the piobus a direct connection to physical memory
     #
-    x86_sys.piobus.port = x86_sys.physmem.port
+    x86_sys.piobus.master = x86_sys.physmem.port
 
     x86_sys.pc.attachIO(x86_sys.piobus)
 
index cf3dfdb89dee57a2920675d9b9179865b7162bba..754a0b79b8f6df6ce229d8db6ac7f63a19ceb540 100644 (file)
@@ -160,13 +160,13 @@ else:
     mem_size = SysConfig().mem()
 if options.caches or options.l2cache:
     test_sys.iocache = IOCache(addr_range=mem_size)
-    test_sys.iocache.cpu_side = test_sys.iobus.port
-    test_sys.iocache.mem_side = test_sys.membus.port
+    test_sys.iocache.cpu_side = test_sys.iobus.master
+    test_sys.iocache.mem_side = test_sys.membus.slave
 else:
     test_sys.iobridge = Bridge(delay='50ns', nack_delay='4ns',
                                ranges = [AddrRange(mem_size)])
-    test_sys.iobridge.slave = test_sys.iobus.port
-    test_sys.iobridge.master = test_sys.membus.port
+    test_sys.iobridge.slave = test_sys.iobus.master
+    test_sys.iobridge.master = test_sys.membus.slave
 
 for i in xrange(np):
     if options.fastmem:
index d7fc45bde60c146850f6b2672b6011ac01c4c322..04b99034c7933236a741061dcc66a8b4b40d50ba 100644 (file)
@@ -130,8 +130,9 @@ for (i, cpu) in enumerate(system.cpu):
     if buildEnv['TARGET_ISA'] == "x86":
         cpu.itb.walker.port = system.ruby._cpu_ruby_ports[i].port
         cpu.dtb.walker.port = system.ruby._cpu_ruby_ports[i].port
-        cpu.interrupts.pio = system.piobus.port
-        cpu.interrupts.int_port = system.piobus.port
+        cpu.interrupts.pio = system.piobus.master
+        cpu.interrupts.int_master = system.piobus.slave
+        cpu.interrupts.int_slave = system.piobus.master
 
 root = Root(full_system = True, system = system)
 
index 35025a8ff27a292780610522ab5f6a3fc96a6740..d7b876d466106d136399e1c1ba486a632e2e371a 100644 (file)
@@ -182,8 +182,8 @@ if options.ruby:
     Ruby.create_system(options, system)
     assert(options.num_cpus == len(system.ruby._cpu_ruby_ports))
 else:
-    system.system_port = system.membus.port
-    system.physmem.port = system.membus.port
+    system.system_port = system.membus.slave
+    system.physmem.port = system.membus.master
     CacheConfig.config_cache(options, system)
 
 for i in xrange(np):
index 920eac01927a458624c96470b8a42792886dc919..1c9b65894e15db5e97716dcc8cbf77ed646a354c 100644 (file)
@@ -106,7 +106,7 @@ def create_system(options, system, piobus = None, dma_devices = []):
     system.sys_port_proxy = sys_port_proxy
 
     # Connect the system port for loading of binaries etc
-    system.system_port = system.sys_port_proxy.port
+    system.system_port = system.sys_port_proxy.slave
 
 
     #
index fc6f51d84fd21946e159f7e737295ccb40a61496..8599fa75f57a8b81335a7c36a91832b6d8102ff5 100644 (file)
@@ -45,7 +45,7 @@ from MemObject import MemObject
 class ArmTableWalker(MemObject):
     type = 'ArmTableWalker'
     cxx_class = 'ArmISA::TableWalker'
-    port = Port("Port for TableWalker to do walk the translation with")
+    port = MasterPort("Port for TableWalker to do walk the translation with")
     sys = Param.System(Parent.any, "system object parameter")
     min_backoff = Param.Tick(0, "Minimum backoff delay after failed send")
     max_backoff = Param.Tick(100000, "Minimum backoff delay after failed send")
index 2f53c4e241de456044d614798598d6d76a50d651..283d94ba734d3825e210e85a6a86050d50fc67b2 100644 (file)
@@ -1,3 +1,15 @@
+# Copyright (c) 2012 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
 # Copyright (c) 2008 The Regents of The University of Michigan
 # All rights reserved.
 #
@@ -35,6 +47,7 @@ class X86LocalApic(BasicPioDevice):
     type = 'X86LocalApic'
     cxx_class = 'X86ISA::Interrupts'
     pio_latency = Param.Latency('1ns', 'Programmed IO latency in simticks')
-    int_port = Port("Port for sending and receiving interrupt messages")
+    int_master = MasterPort("Port for sending interrupt messages")
+    int_slave = SlavePort("Port for receiving interrupt messages")
     int_latency = Param.Latency('1ns', \
             "Latency for an interrupt to propagate through this device.")
index 7f2fcd358caa867371772025c6035100fe5bb24e..334d2a0cf4a9bd5e54028ed34958010ee9330b06 100644 (file)
@@ -44,7 +44,7 @@ from MemObject import MemObject
 class X86PagetableWalker(MemObject):
     type = 'X86PagetableWalker'
     cxx_class = 'X86ISA::Walker'
-    port = Port("Port for the hardware table walker")
+    port = MasterPort("Port for the hardware table walker")
     system = Param.System(Parent.any, "system object")
 
 class X86TLB(BaseTLB):
index 8567b30f09d036621b8338e2cdae990ab1965775..13ad2069b9c9ef27f32bfbebee3756c9dd362d55 100644 (file)
@@ -1,4 +1,16 @@
 /*
+ * Copyright (c) 2012 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder.  You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
  * Copyright (c) 2007 The Hewlett-Packard Development Company
  * All rights reserved.
  *
@@ -35,6 +47,7 @@
  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  *
  * Authors: Gabe Black
+ *          Andreas Hansson
  */
 
 #ifndef __ARCH_X86_INTERRUPTS_HH__
@@ -225,8 +238,15 @@ class Interrupts : public BasicPioDevice, IntDev
 
     Port *getPort(const std::string &if_name, int idx = -1)
     {
-        if (if_name == "int_port")
+        // a bit of an odd one since there is now two ports in the
+        // Python class we also need two ports even if they are
+        // identical
+        if (if_name == "int_master") {
             return intPort;
+        } else if (if_name == "int_slave") {
+            // memory leak...but will be removed in the next patch
+            return new IntPort(name() + ".int_slave", this, this, latency);
+        }
         return BasicPioDevice::getPort(if_name, idx);
     }
 
index fda0a3bc8f4e0b13fa67c9dfcb621d5675f55776..0bb2090ad33ecb22066c68be1e81f567f416015d 100644 (file)
@@ -1,3 +1,15 @@
+# Copyright (c) 2012 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
 # Copyright (c) 2005-2008 The Regents of The University of Michigan
 # Copyright (c) 2011 Regents of the University of California
 # All rights reserved.
@@ -27,6 +39,7 @@
 #
 # Authors: Nathan Binkert
 #          Rick Strong
+#          Andreas Hansson
 
 import sys
 
@@ -138,24 +151,28 @@ class BaseCPU(MemObject):
 
     tracer = Param.InstTracer(default_tracer, "Instruction tracer")
 
-    icache_port = Port("Instruction Port")
-    dcache_port = Port("Data Port")
+    icache_port = MasterPort("Instruction Port")
+    dcache_port = MasterPort("Data Port")
     _cached_ports = ['icache_port', 'dcache_port']
 
     if buildEnv['TARGET_ISA'] in ['x86', 'arm']:
         _cached_ports += ["itb.walker.port", "dtb.walker.port"]
 
-    _uncached_ports = []
+    _uncached_slave_ports = []
+    _uncached_master_ports = []
     if buildEnv['TARGET_ISA'] == 'x86':
-        _uncached_ports = ["interrupts.pio", "interrupts.int_port"]
+        _uncached_slave_ports += ["interrupts.pio", "interrupts.int_slave"]
+        _uncached_master_ports += ["interrupts.int_master"]
 
     def connectCachedPorts(self, bus):
         for p in self._cached_ports:
-            exec('self.%s = bus.port' % p)
+            exec('self.%s = bus.slave' % p)
 
     def connectUncachedPorts(self, bus):
-        for p in self._uncached_ports:
-            exec('self.%s = bus.port' % p)
+        for p in self._uncached_slave_ports:
+            exec('self.%s = bus.master' % p)
+        for p in self._uncached_master_ports:
+            exec('self.%s = bus.slave' % p)
 
     def connectAllPorts(self, cached_bus, uncached_bus = None):
         self.connectCachedPorts(cached_bus)
@@ -190,5 +207,5 @@ class BaseCPU(MemObject):
         self.toL2Bus = Bus()
         self.connectCachedPorts(self.toL2Bus)
         self.l2cache = l2c
-        self.l2cache.cpu_side = self.toL2Bus.port
+        self.toL2Bus.master = self.l2cache.cpu_side
         self._cached_ports = ['l2cache.mem_side']
index 93cd02ba731d03a5c620ef6f2088dece834695b2..1199f35e189c32296e8c2cfd503fdfed33942d0e 100644 (file)
@@ -34,4 +34,4 @@ class AtomicSimpleCPU(BaseSimpleCPU):
     width = Param.Int(1, "CPU width")
     simulate_data_stalls = Param.Bool(False, "Simulate dcache stall cycles")
     simulate_inst_stalls = Param.Bool(False, "Simulate icache stall cycles")
-    physmem_port = Port("Physical Memory Port")
+    physmem_port = MasterPort("Physical Memory Port")
index ccadc5b36d9f5d7b795b75a0786a3665cba67ed0..bf3eace08613a06eb09d3d36f4dc4baab3a64635 100644 (file)
@@ -48,6 +48,6 @@ class InvalidateGenerator(DirectedGenerator):
 
 class RubyDirectedTester(MemObject):
     type = 'RubyDirectedTester'
-    cpuPort = VectorPort("the cpu ports")
+    cpuPort = VectorMasterPort("the cpu ports")
     requests_to_complete = Param.Int("checks to complete")
     generator = Param.DirectedGenerator("the request generator")
index 6a35683794b80045c0e649f5c4f439ad5892c3c8..1b4d6767cfe6dd7de8e0e5be3517a51032b970cf 100644 (file)
@@ -48,8 +48,9 @@ class MemTest(MemObject):
         "progress report interval (in accesses)")
     trace_addr = Param.Addr(0, "address to trace")
 
-    test = Port("Port to the memory system to test")
-    functional = Port("Port to the functional memory used for verification")
+    test = MasterPort("Port to the memory system to test")
+    functional = MasterPort("Port to the functional memory " \
+                                "used for verification")
     suppress_func_warnings = Param.Bool(False,
         "suppress warnings when functional accesses fail.\n")
     sys = Param.System(Parent.any, "System Parameter")
index b2eda9aa2e7dd1772dc543e64558d2d3a9b076b5..7d6ed576bb785f8a794879e9737cb7590f8723db 100644 (file)
@@ -41,5 +41,5 @@ class NetworkTest(MemObject):
     traffic_type = Param.Counter(0, "Traffic type: uniform random, tornado, bit complement")
     inj_rate = Param.Float(0.1, "Packet injection rate")
     precision = Param.Int(3, "Number of digits of precision after decimal point")
-    test = Port("Port to the memory system to test")
+    test = MasterPort("Port to the memory system to test")
     system = Param.System(Parent.any, "System we belong to")
index fc0a60e11a29b3671323cf70f7950d6ccf851fed..6518862e9287ad9c4c83f3b4913bc1a25ec1bb2f 100644 (file)
@@ -32,7 +32,7 @@ from m5.proxy import *
 
 class RubyTester(MemObject):
     type = 'RubyTester'
-    cpuPort = VectorPort("the cpu ports")
+    cpuPort = VectorMasterPort("the cpu ports")
     checks_to_complete = Param.Int(100, "checks to complete")
     deadlock_threshold = Param.Int(50000, "how often to check for deadlock")
     wakeup_frequency = Param.Int(10, "number of cycles between wakeups")
index c32946277e8dda108fbb623825b5d8bd9913110b..96c95ebc95cf0ea609793038e67319cebd65a07a 100644 (file)
@@ -33,7 +33,7 @@ from MemObject import MemObject
 class PioDevice(MemObject):
     type = 'PioDevice'
     abstract = True
-    pio = Port("Programmed I/O port")
+    pio = SlavePort("Programmed I/O port")
     system = Param.System(Parent.any, "System this device is part of")
 
 class BasicPioDevice(PioDevice):
@@ -45,7 +45,7 @@ class BasicPioDevice(PioDevice):
 class DmaDevice(PioDevice):
     type = 'DmaDevice'
     abstract = True
-    dma = Port("DMA port")
+    dma = MasterPort("DMA port")
     min_backoff_delay = Param.Latency('4ns',
       "min time between a nack packet being received and the next request made by the device")
     max_backoff_delay = Param.Latency('10us',
index 539e4ea9bbc20b673ab1e307a6ce01a6905c3dfd..91d4e230e6b049609eb976fd335f8d747b0f0e5f 100644 (file)
@@ -37,8 +37,8 @@ class EtherObject(SimObject):
 
 class EtherLink(EtherObject):
     type = 'EtherLink'
-    int0 = Port("interface 0")
-    int1 = Port("interface 1")
+    int0 = SlavePort("interface 0")
+    int1 = SlavePort("interface 1")
     delay = Param.Latency('0us', "packet transmit delay")
     delay_var = Param.Latency('0ns', "packet transmit delay variability")
     speed = Param.NetworkBandwidth('1Gbps', "link speed")
@@ -64,7 +64,7 @@ class EtherDump(SimObject):
 class EtherDevice(PciDevice):
     type = 'EtherDevice'
     abstract = True
-    interface = Port("Ethernet Interface")
+    interface = MasterPort("Ethernet Interface")
 
 class IGbE(EtherDevice):
     # Base class for two IGbE adapters listed above
index 95cb3916fb54ec7cf25cc1e9e47705081f9f0114..c866f9386590f11d0f6b2abfb9a25d60f56ad4d2 100644 (file)
@@ -43,7 +43,7 @@ class PciDevice(DmaDevice):
     type = 'PciDevice'
     abstract = True
     platform = Param.Platform(Parent.any, "Platform this device is part of.")
-    config = Port("PCI configuration space port")
+    config = SlavePort("PCI configuration space port")
     pci_bus = Param.Int("PCI bus")
     pci_dev = Param.Int("PCI device number")
     pci_func = Param.Int("PCI function code")
index e6a8996049deb515b1e8edc9713b1c88ae22d14f..9a3ec0593a5d7d2a5a8b2135f11a9ec71e2e34a1 100644 (file)
@@ -93,30 +93,30 @@ class Tsunami(Platform):
     # earlier, since the bus object itself is typically defined at the
     # System level.
     def attachIO(self, bus):
-        self.cchip.pio = bus.port
-        self.pchip.pio = bus.port
+        self.cchip.pio = bus.master
+        self.pchip.pio = bus.master
         self.pciconfig.pio = bus.default
         bus.use_default_range = True
-        self.fake_sm_chip.pio = bus.port
-        self.fake_uart1.pio = bus.port
-        self.fake_uart2.pio = bus.port
-        self.fake_uart3.pio = bus.port
-        self.fake_uart4.pio = bus.port
-        self.fake_ppc.pio = bus.port
-        self.fake_OROM.pio = bus.port
-        self.fake_pnp_addr.pio = bus.port
-        self.fake_pnp_write.pio = bus.port
-        self.fake_pnp_read0.pio = bus.port
-        self.fake_pnp_read1.pio = bus.port
-        self.fake_pnp_read2.pio = bus.port
-        self.fake_pnp_read3.pio = bus.port
-        self.fake_pnp_read4.pio = bus.port
-        self.fake_pnp_read5.pio = bus.port
-        self.fake_pnp_read6.pio = bus.port
-        self.fake_pnp_read7.pio = bus.port
-        self.fake_ata0.pio = bus.port
-        self.fake_ata1.pio = bus.port
-        self.fb.pio = bus.port
-        self.io.pio = bus.port
-        self.uart.pio = bus.port
-        self.backdoor.pio = bus.port
+        self.fake_sm_chip.pio = bus.master
+        self.fake_uart1.pio = bus.master
+        self.fake_uart2.pio = bus.master
+        self.fake_uart3.pio = bus.master
+        self.fake_uart4.pio = bus.master
+        self.fake_ppc.pio = bus.master
+        self.fake_OROM.pio = bus.master
+        self.fake_pnp_addr.pio = bus.master
+        self.fake_pnp_write.pio = bus.master
+        self.fake_pnp_read0.pio = bus.master
+        self.fake_pnp_read1.pio = bus.master
+        self.fake_pnp_read2.pio = bus.master
+        self.fake_pnp_read3.pio = bus.master
+        self.fake_pnp_read4.pio = bus.master
+        self.fake_pnp_read5.pio = bus.master
+        self.fake_pnp_read6.pio = bus.master
+        self.fake_pnp_read7.pio = bus.master
+        self.fake_ata0.pio = bus.master
+        self.fake_ata1.pio = bus.master
+        self.fb.pio = bus.master
+        self.io.pio = bus.master
+        self.uart.pio = bus.master
+        self.backdoor.pio = bus.master
index 3da47399e101773562cad5b6d0b414247a273750..e42bc4b94b5b281199cef268f18cc5eaa135767e 100644 (file)
@@ -181,10 +181,10 @@ class RealViewPBX(RealView):
     # Attach I/O devices that are on chip and also set the appropriate
     # ranges for the bridge
     def attachOnChipIO(self, bus, bridge):
-       self.gic.pio = bus.port
-       self.l2x0_fake.pio = bus.port
-       self.a9scu.pio = bus.port
-       self.local_cpu_timer.pio = bus.port
+       self.gic.pio = bus.master
+       self.l2x0_fake.pio = bus.master
+       self.a9scu.pio = bus.master
+       self.local_cpu_timer.pio = bus.master
        # Bridge ranges based on excluding what is part of on-chip I/O
        # (gic, l2x0, a9scu, local_cpu_timer)
        bridge.ranges = [AddrRange(self.realview_io.pio_addr,
@@ -195,33 +195,33 @@ class RealViewPBX(RealView):
     # earlier, since the bus object itself is typically defined at the
     # System level.
     def attachIO(self, bus):
-       self.uart.pio          = bus.port
-       self.realview_io.pio   = bus.port
-       self.timer0.pio        = bus.port
-       self.timer1.pio        = bus.port
-       self.clcd.pio          = bus.port
-       self.clcd.dma          = bus.port
-       self.kmi0.pio          = bus.port
-       self.kmi1.pio          = bus.port
-       self.cf_ctrl.pio       = bus.port
-       self.cf_ctrl.config    = bus.port
-       self.cf_ctrl.dma       = bus.port
-       self.dmac_fake.pio     = bus.port
-       self.uart1_fake.pio    = bus.port
-       self.uart2_fake.pio    = bus.port
-       self.uart3_fake.pio    = bus.port
-       self.smc_fake.pio      = bus.port
-       self.sp810_fake.pio    = bus.port
-       self.watchdog_fake.pio = bus.port
-       self.gpio0_fake.pio    = bus.port
-       self.gpio1_fake.pio    = bus.port
-       self.gpio2_fake.pio    = bus.port
-       self.ssp_fake.pio      = bus.port
-       self.sci_fake.pio      = bus.port
-       self.aaci_fake.pio     = bus.port
-       self.mmc_fake.pio      = bus.port
-       self.rtc_fake.pio      = bus.port
-       self.flash_fake.pio    = bus.port
+       self.uart.pio          = bus.master
+       self.realview_io.pio   = bus.master
+       self.timer0.pio        = bus.master
+       self.timer1.pio        = bus.master
+       self.clcd.pio          = bus.master
+       self.clcd.dma          = bus.slave
+       self.kmi0.pio          = bus.master
+       self.kmi1.pio          = bus.master
+       self.cf_ctrl.pio       = bus.master
+       self.cf_ctrl.config    = bus.master
+       self.cf_ctrl.dma       = bus.slave
+       self.dmac_fake.pio     = bus.master
+       self.uart1_fake.pio    = bus.master
+       self.uart2_fake.pio    = bus.master
+       self.uart3_fake.pio    = bus.master
+       self.smc_fake.pio      = bus.master
+       self.sp810_fake.pio    = bus.master
+       self.watchdog_fake.pio = bus.master
+       self.gpio0_fake.pio    = bus.master
+       self.gpio1_fake.pio    = bus.master
+       self.gpio2_fake.pio    = bus.master
+       self.ssp_fake.pio      = bus.master
+       self.sci_fake.pio      = bus.master
+       self.aaci_fake.pio     = bus.master
+       self.mmc_fake.pio      = bus.master
+       self.rtc_fake.pio      = bus.master
+       self.flash_fake.pio    = bus.master
 
 # Reference for memory map and interrupt number
 # RealView Emulation Baseboard User Guide (ARM DUI 0143B)
@@ -261,8 +261,8 @@ class RealViewEB(RealView):
     # Attach I/O devices that are on chip and also set the appropriate
     # ranges for the bridge
     def attachOnChipIO(self, bus, bridge):
-       self.gic.pio = bus.port
-       self.l2x0_fake.pio = bus.port
+       self.gic.pio = bus.master
+       self.l2x0_fake.pio = bus.master
        # Bridge ranges based on excluding what is part of on-chip I/O
        # (gic, l2x0)
        bridge.ranges = [AddrRange(self.realview_io.pio_addr,
@@ -273,31 +273,31 @@ class RealViewEB(RealView):
     # earlier, since the bus object itself is typically defined at the
     # System level.
     def attachIO(self, bus):
-       self.uart.pio          = bus.port
-       self.realview_io.pio   = bus.port
-       self.timer0.pio        = bus.port
-       self.timer1.pio        = bus.port
-       self.clcd.pio          = bus.port
-       self.clcd.dma          = bus.port
-       self.kmi0.pio          = bus.port
-       self.kmi1.pio          = bus.port
-       self.dmac_fake.pio     = bus.port
-       self.uart1_fake.pio    = bus.port
-       self.uart2_fake.pio    = bus.port
-       self.uart3_fake.pio    = bus.port
-       self.smc_fake.pio      = bus.port
-       self.sp810_fake.pio    = bus.port
-       self.watchdog_fake.pio = bus.port
-       self.gpio0_fake.pio    = bus.port
-       self.gpio1_fake.pio    = bus.port
-       self.gpio2_fake.pio    = bus.port
-       self.ssp_fake.pio      = bus.port
-       self.sci_fake.pio      = bus.port
-       self.aaci_fake.pio     = bus.port
-       self.mmc_fake.pio      = bus.port
-       self.rtc_fake.pio      = bus.port
-       self.flash_fake.pio    = bus.port
-       self.smcreg_fake.pio   = bus.port
+       self.uart.pio          = bus.master
+       self.realview_io.pio   = bus.master
+       self.timer0.pio        = bus.master
+       self.timer1.pio        = bus.master
+       self.clcd.pio          = bus.master
+       self.clcd.dma          = bus.slave
+       self.kmi0.pio          = bus.master
+       self.kmi1.pio          = bus.master
+       self.dmac_fake.pio     = bus.master
+       self.uart1_fake.pio    = bus.master
+       self.uart2_fake.pio    = bus.master
+       self.uart3_fake.pio    = bus.master
+       self.smc_fake.pio      = bus.master
+       self.sp810_fake.pio    = bus.master
+       self.watchdog_fake.pio = bus.master
+       self.gpio0_fake.pio    = bus.master
+       self.gpio1_fake.pio    = bus.master
+       self.gpio2_fake.pio    = bus.master
+       self.ssp_fake.pio      = bus.master
+       self.sci_fake.pio      = bus.master
+       self.aaci_fake.pio     = bus.master
+       self.mmc_fake.pio      = bus.master
+       self.rtc_fake.pio      = bus.master
+       self.flash_fake.pio    = bus.master
+       self.smcreg_fake.pio   = bus.master
 
 class VExpress_ELT(RealView):
     pci_cfg_base = 0xD0000000
@@ -349,9 +349,9 @@ class VExpress_ELT(RealView):
     # Attach I/O devices that are on chip and also set the appropriate
     # ranges for the bridge
     def attachOnChipIO(self, bus, bridge):
-       self.gic.pio = bus.port
-       self.a9scu.pio = bus.port
-       self.local_cpu_timer.pio = bus.port
+       self.gic.pio = bus.master
+       self.a9scu.pio = bus.master
+       self.local_cpu_timer.pio = bus.master
        # Bridge ranges based on excluding what is part of on-chip I/O
        # (gic, a9scu)
        bridge.ranges = [AddrRange(self.pci_cfg_base, self.a9scu.pio_addr - 1),
@@ -361,44 +361,44 @@ class VExpress_ELT(RealView):
     # earlier, since the bus object itself is typically defined at the
     # System level.
     def attachIO(self, bus):
-       self.elba_uart.pio       = bus.port
-       self.uart.pio            = bus.port
-       self.realview_io.pio     = bus.port
-       self.v2m_timer0.pio      = bus.port
-       self.v2m_timer1.pio      = bus.port
-       self.elba_timer0.pio     = bus.port
-       self.elba_timer1.pio     = bus.port
-       self.clcd.pio            = bus.port
-       self.clcd.dma            = bus.port
-       self.kmi0.pio            = bus.port
-       self.kmi1.pio            = bus.port
-       self.elba_kmi0.pio       = bus.port
-       self.elba_kmi1.pio       = bus.port
-       self.cf_ctrl.pio         = bus.port
-       self.cf_ctrl.config      = bus.port
+       self.elba_uart.pio       = bus.master
+       self.uart.pio            = bus.master
+       self.realview_io.pio     = bus.master
+       self.v2m_timer0.pio      = bus.master
+       self.v2m_timer1.pio      = bus.master
+       self.elba_timer0.pio     = bus.master
+       self.elba_timer1.pio     = bus.master
+       self.clcd.pio            = bus.master
+       self.clcd.dma            = bus.slave
+       self.kmi0.pio            = bus.master
+       self.kmi1.pio            = bus.master
+       self.elba_kmi0.pio       = bus.master
+       self.elba_kmi1.pio       = bus.master
+       self.cf_ctrl.pio         = bus.master
+       self.cf_ctrl.config      = bus.master
        self.cf_ctrl.dma         = bus.port
-       self.ide.pio             = bus.port
-       self.ide.config          = bus.port
-       self.ide.dma             = bus.port
-       self.ethernet.pio        = bus.port
-       self.ethernet.config     = bus.port
-       self.ethernet.dma        = bus.port
+       self.ide.pio             = bus.master
+       self.ide.config          = bus.master
+       self.ide.dma             = bus.slave
+       self.ethernet.pio        = bus.master
+       self.ethernet.config     = bus.master
+       self.ethernet.dma        = bus.slave
        self.pciconfig.pio       = bus.default
        bus.use_default_range    = True
 
-       self.l2x0_fake.pio       = bus.port
-       self.dmac_fake.pio       = bus.port
-       self.uart1_fake.pio      = bus.port
-       self.uart2_fake.pio      = bus.port
-       self.uart3_fake.pio      = bus.port
-       self.smc_fake.pio        = bus.port
-       self.sp810_fake.pio      = bus.port
-       self.watchdog_fake.pio   = bus.port
-       self.aaci_fake.pio       = bus.port
-       self.elba_aaci_fake.pio  = bus.port
-       self.mmc_fake.pio        = bus.port
-       self.rtc_fake.pio        = bus.port
-       self.spsc_fake.pio       = bus.port
-       self.lan_fake.pio        = bus.port
-       self.usb_fake.pio        = bus.port
+       self.l2x0_fake.pio       = bus.master
+       self.dmac_fake.pio       = bus.master
+       self.uart1_fake.pio      = bus.master
+       self.uart2_fake.pio      = bus.master
+       self.uart3_fake.pio      = bus.master
+       self.smc_fake.pio        = bus.master
+       self.sp810_fake.pio      = bus.master
+       self.watchdog_fake.pio   = bus.master
+       self.aaci_fake.pio       = bus.master
+       self.elba_aaci_fake.pio  = bus.master
+       self.mmc_fake.pio        = bus.master
+       self.rtc_fake.pio        = bus.master
+       self.spsc_fake.pio       = bus.master
+       self.lan_fake.pio        = bus.master
+       self.usb_fake.pio        = bus.master
 
index d4ab2cb17c50a1269004d6a45c36e5964103d75c..09923f6c2610a478efdf8b0b264dd41723f9edd3 100644 (file)
@@ -37,7 +37,7 @@ class I82094AA(BasicPioDevice):
     apic_id = Param.Int(1, 'APIC id for this IO APIC')
     pio_latency = Param.Latency('1ns', "Programmed IO latency in simticks")
     pio_addr = Param.Addr("Device address")
-    int_port = Port("Port for sending and receiving interrupt messages")
+    int_master = MasterPort("Port for sending interrupt messages")
     int_latency = Param.Latency('1ns', \
             "Latency for an interrupt to propagate through this device.")
     external_int_pic = Param.I8259(NULL, "External PIC, if any")
index bb8c91ac66f31ae92526231696cfb00e8e774143..5b7d0864ef6da32225798dca47373f3b1df05dcc 100644 (file)
@@ -71,12 +71,12 @@ class Pc(Platform):
 
     def attachIO(self, bus):
         self.south_bridge.attachIO(bus)
-        self.i_dont_exist.pio = bus.port
-        self.behind_pci.pio = bus.port
-        self.com_1.pio = bus.port
-        self.fake_com_2.pio = bus.port
-        self.fake_com_3.pio = bus.port
-        self.fake_com_4.pio = bus.port
-        self.fake_floppy.pio = bus.port
+        self.i_dont_exist.pio = bus.master
+        self.behind_pci.pio = bus.master
+        self.com_1.pio = bus.master
+        self.fake_com_2.pio = bus.master
+        self.fake_com_3.pio = bus.master
+        self.fake_com_4.pio = bus.master
+        self.fake_floppy.pio = bus.master
         self.pciconfig.pio = bus.default
         bus.use_default_range = True
index baff35e0b468d047f4f2cd57852b24bfe54ea6b8..9f7070e963509cc60f2718637b4fbd74fffb1db5 100644 (file)
@@ -102,15 +102,15 @@ class SouthBridge(SimObject):
         self.speaker.i8254 = self.pit
         self.io_apic.external_int_pic = self.pic1
         # Connect to the bus
-        self.cmos.pio = bus.port
-        self.dma1.pio = bus.port
-        self.ide.pio = bus.port
-        self.ide.config = bus.port
-        self.ide.dma = bus.port
-        self.keyboard.pio = bus.port
-        self.pic1.pio = bus.port
-        self.pic2.pio = bus.port
-        self.pit.pio = bus.port
-        self.speaker.pio = bus.port
-        self.io_apic.pio = bus.port
-        self.io_apic.int_port = bus.port
+        self.cmos.pio = bus.master
+        self.dma1.pio = bus.master
+        self.ide.pio = bus.master
+        self.ide.config = bus.master
+        self.ide.dma = bus.slave
+        self.keyboard.pio = bus.master
+        self.pic1.pio = bus.master
+        self.pic2.pio = bus.master
+        self.pit.pio = bus.master
+        self.speaker.pio = bus.master
+        self.io_apic.pio = bus.master
+        self.io_apic.int_master = bus.slave
index dfef059c33a8a4ddd6b94ab258c9156360581f2e..60ef270126cbd3e130a9f15dbc03a0973632b891 100644 (file)
@@ -123,7 +123,7 @@ class I82094AA : public PioDevice, public IntDev
 
     Port *getPort(const std::string &if_name, int idx = -1)
     {
-        if (if_name == "int_port")
+        if (if_name == "int_master")
             return intPort;
         return PioDevice::getPort(if_name, idx);
     }
index 9713d042bd5e8a2d6f2fb9350b23fa83b7107f26..05b4d12a1a8039be9d69430fb7dd3cf8aa2eb384 100644 (file)
@@ -90,7 +90,7 @@ class IntDev
     IntDev(MemObject * parent, Tick latency = 0)
     {
         if (parent != NULL) {
-            intPort = new IntPort(parent->name() + ".int_port",
+            intPort = new IntPort(parent->name() + ".int_master",
                     parent, this, latency);
         } else {
             intPort = NULL;
index 38b344613b68a962d04cb62d1c18b699087ff29d..ea8684e1bba6e25f7b70fa937c0811aedb9c57fb 100644 (file)
@@ -31,8 +31,8 @@ from MemObject import MemObject
 
 class Bridge(MemObject):
     type = 'Bridge'
-    slave = Port('Slave port')
-    master = Port('Master port')
+    slave = SlavePort('Slave port')
+    master = MasterPort('Master port')
     req_size = Param.Int(16, "The number of requests to buffer")
     resp_size = Param.Int(16, "The number of requests to buffer")
     delay = Param.Latency('0ns', "The latency of this bridge")
index fda91742f0e67c24c216bbff902f2c97abcd92bd..91043da80c158b6ede5d353e487e86199b883ab0 100644 (file)
@@ -33,13 +33,14 @@ from MemObject import MemObject
 
 class Bus(MemObject):
     type = 'Bus'
-    port = VectorPort("vector port for connecting devices")
+    slave = VectorSlavePort("vector port for connecting masters")
+    master = VectorMasterPort("vector port for connecting slaves")
     bus_id = Param.Int(0, "blah")
     clock = Param.Clock("1GHz", "bus clock speed")
     header_cycles = Param.Int(1, "cycles of overhead per transaction")
     width = Param.Int(64, "bus width (bytes)")
     block_size = Param.Int(64, "The default block size if one isn't set by a device attached to the bus.")
-    default = \
-            Port("Default port for requests that aren't handled by a device.")
+    default = MasterPort("Default port for requests that aren't handled " \
+                             "by a device.")
     use_default_range = \
             Param.Bool(False, "Query default port device for legal range.")
index 95cc73daa44a3746badbaea7809907f88fcac5de..c5f80b4c90529ff7b143696f339d8d7838617278 100644 (file)
@@ -32,7 +32,7 @@ from MemObject import *
 
 class PhysicalMemory(MemObject):
     type = 'PhysicalMemory'
-    port = VectorPort("the access port")
+    port = VectorSlavePort("the access port")
     range = Param.AddrRange(AddrRange('128MB'), "Device Address")
     file = Param.String('', "memory mapped file")
     latency = Param.Latency('30ns', "latency of an access")
index 4389eb3568e01b548c44cf43da2990a0a7d77b74..adc48a461aeeefa0577af2d1a4f74d6c519feaf7 100644 (file)
@@ -58,7 +58,7 @@ class BaseCache(MemObject):
     prefetch_on_access = Param.Bool(False,
          "notify the hardware prefetcher on every access (not just misses)")
     prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache")
-    cpu_side = Port("Port on side closer to CPU")
-    mem_side = Port("Port on side closer to MEM")
+    cpu_side = SlavePort("Port on side closer to CPU")
+    mem_side = MasterPort("Port on side closer to MEM")
     addr_range = Param.AddrRange(AllMemory, "The address range for the CPU-side port")
     system = Param.System(Parent.any, "System we belong to")
index ab3e6e3b7c333425b2188955353099b71eec9b68..2ef65a13abe3ca1182c0732466397eb6a667fe60 100644 (file)
@@ -68,13 +68,24 @@ RubyPort::init()
 Port *
 RubyPort::getPort(const std::string &if_name, int idx)
 {
-    if (if_name == "port") {
-        M5Port* cpuPort = new M5Port(csprintf("%s-port%d", name(), idx),
+    // used by the CPUs to connect the caches to the interconnect, and
+    // for the x86 case also the interrupt master
+    if (if_name == "slave") {
+        M5Port* cpuPort = new M5Port(csprintf("%s-slave%d", name(), idx),
                                      this, ruby_system, access_phys_mem);
         cpu_ports.push_back(cpuPort);
         return cpuPort;
     }
 
+    // used by the x86 CPUs to connect the interrupt PIO and interrupt slave
+    // port
+    if (if_name == "master") {
+        PioPort* masterPort = new PioPort(csprintf("%s-master%d", name(), idx),
+                                          this);
+
+        return masterPort;
+    }
+
     if (if_name == "pio_port") {
         // ensure there is only one pio port
         assert(pio_port == NULL);
index ddf760f7b2a8183b8bab8cc8554e155b976acd22..b1e17e052edbb5616e3d4ff3d50221fdfc4528ee 100644 (file)
@@ -34,11 +34,12 @@ from MemObject import MemObject
 class RubyPort(MemObject):
     type = 'RubyPort'
     abstract = True
-    port = VectorPort("M5 port")
+    slave = VectorSlavePort("CPU slave port")
+    master = VectorMasterPort("CPU master port")
     version = Param.Int(0, "")
-    pio_port = Port("Ruby_pio_port")
+    pio_port = MasterPort("Ruby_pio_port")
     physmem = Param.PhysicalMemory("")
-    physMemPort = Port("port to physical memory")
+    physMemPort = MasterPort("port to physical memory")
     using_ruby_tester = Param.Bool(False, "")
     using_network_tester = Param.Bool(False, "")
     access_phys_mem = Param.Bool(True,
index c45867c85b6f7eff6888e81d13a56de8997994b1..afdd84fe35dd180fb91f82ca091ae947b67aa271 100644 (file)
@@ -46,7 +46,7 @@ from m5.params import *
 # There are a few things we need that aren't in params.__all__ since
 # normal users don't need them
 from m5.params import ParamDesc, VectorParamDesc, \
-     isNullPointer, SimObjectVector
+     isNullPointer, SimObjectVector, Port
 
 from m5.proxy import *
 from m5.proxy import isproxy
index dfc703a403e9aa863799afe9f1a6806d5fd99c61..95958e3e6909ec2123a421baed9da81f3e26ad0c 100644 (file)
@@ -1,3 +1,15 @@
+# Copyright (c) 2012 ARM Limited
+# All rights reserved.
+#
+# The license below extends only to copyright in the software and shall
+# not be construed as granting a license to any other intellectual
+# property including but not limited to intellectual property relating
+# to a hardware implementation of the functionality of the software
+# licensed hereunder.  You may use the software subject to the license
+# terms below provided that you ensure that this notice is replicated
+# unmodified and in its entirety in all distributions of the software,
+# modified or unmodified, in source code or in binary form.
+#
 # Copyright (c) 2004-2006 The Regents of The University of Michigan
 # Copyright (c) 2010-2011 Advanced Micro Devices, Inc.
 # All rights reserved.
@@ -28,6 +40,7 @@
 # Authors: Steve Reinhardt
 #          Nathan Binkert
 #          Gabe Black
+#          Andreas Hansson
 
 #####################################################################
 #
@@ -1324,10 +1337,11 @@ AllMemory = AddrRange(0, MaxAddr)
 # Port reference: encapsulates a reference to a particular port on a
 # particular SimObject.
 class PortRef(object):
-    def __init__(self, simobj, name):
+    def __init__(self, simobj, name, role):
         assert(isSimObject(simobj) or isSimObjectClass(simobj))
         self.simobj = simobj
         self.name = name
+        self.role = role
         self.peer = None   # not associated with another port yet
         self.ccConnected = False # C++ port connection done?
         self.index = -1  # always -1 for non-vector ports
@@ -1397,12 +1411,24 @@ class PortRef(object):
     def ccConnect(self):
         from m5.internal.pyobject import connectPorts
 
+        if self.role == 'SLAVE':
+            # do nothing and let the master take care of it
+            return
+
         if self.ccConnected: # already done this
             return
         peer = self.peer
         if not self.peer: # nothing to connect to
             return
+
+        # check that we connect a master to a slave
+        if self.role == peer.role:
+            raise TypeError, \
+                "cannot connect '%s' and '%s' due to identical role '%s'" \
+                % (peer, self, self.role)
+
         try:
+            # self is always the master and peer the slave
             connectPorts(self.simobj.getCCObject(), self.name, self.index,
                          peer.simobj.getCCObject(), peer.name, peer.index)
         except:
@@ -1416,8 +1442,8 @@ class PortRef(object):
 # A reference to an individual element of a VectorPort... much like a
 # PortRef, but has an index.
 class VectorPortElementRef(PortRef):
-    def __init__(self, simobj, name, index):
-        PortRef.__init__(self, simobj, name)
+    def __init__(self, simobj, name, role, index):
+        PortRef.__init__(self, simobj, name, role)
         self.index = index
 
     def __str__(self):
@@ -1426,10 +1452,11 @@ class VectorPortElementRef(PortRef):
 # A reference to a complete vector-valued port (not just a single element).
 # Can be indexed to retrieve individual VectorPortElementRef instances.
 class VectorPortRef(object):
-    def __init__(self, simobj, name):
+    def __init__(self, simobj, name, role):
         assert(isSimObject(simobj) or isSimObjectClass(simobj))
         self.simobj = simobj
         self.name = name
+        self.role = role
         self.elements = []
 
     def __str__(self):
@@ -1444,7 +1471,7 @@ class VectorPortRef(object):
             raise TypeError, "VectorPort index must be integer"
         if key >= len(self.elements):
             # need to extend list
-            ext = [VectorPortElementRef(self.simobj, self.name, i)
+            ext = [VectorPortElementRef(self.simobj, self.name, self.role, i)
                    for i in range(len(self.elements), key+1)]
             self.elements.extend(ext)
         return self.elements[key]
@@ -1488,34 +1515,62 @@ class VectorPortRef(object):
 # logical port in the SimObject class, not a particular port on a
 # SimObject instance.  The latter are represented by PortRef objects.
 class Port(object):
-    # Port("description")
-    def __init__(self, *args):
-        if len(args) == 1:
-            self.desc = args[0]
-        else:
-            raise TypeError, 'wrong number of arguments'
-        # self.name is set by SimObject class on assignment
-        # e.g., pio_port = Port("blah") sets self.name to 'pio_port'
-
     # Generate a PortRef for this port on the given SimObject with the
     # given name
     def makeRef(self, simobj):
-        return PortRef(simobj, self.name)
+        return PortRef(simobj, self.name, self.role)
 
     # Connect an instance of this port (on the given SimObject with
     # the given name) with the port described by the supplied PortRef
     def connect(self, simobj, ref):
         self.makeRef(simobj).connect(ref)
 
+class MasterPort(Port):
+    # MasterPort("description")
+    def __init__(self, *args):
+        if len(args) == 1:
+            self.desc = args[0]
+            self.role = 'MASTER'
+        else:
+            raise TypeError, 'wrong number of arguments'
+
+class SlavePort(Port):
+    # SlavePort("description")
+    def __init__(self, *args):
+        if len(args) == 1:
+            self.desc = args[0]
+            self.role = 'SLAVE'
+        else:
+            raise TypeError, 'wrong number of arguments'
+
 # VectorPort description object.  Like Port, but represents a vector
 # of connections (e.g., as on a Bus).
 class VectorPort(Port):
     def __init__(self, *args):
-        Port.__init__(self, *args)
         self.isVec = True
 
     def makeRef(self, simobj):
-        return VectorPortRef(simobj, self.name)
+        return VectorPortRef(simobj, self.name, self.role)
+
+class VectorMasterPort(VectorPort):
+    # VectorMasterPort("description")
+    def __init__(self, *args):
+        if len(args) == 1:
+            self.desc = args[0]
+            self.role = 'MASTER'
+            VectorPort.__init__(self, *args)
+        else:
+            raise TypeError, 'wrong number of arguments'
+
+class VectorSlavePort(VectorPort):
+    # VectorSlavePort("description")
+    def __init__(self, *args):
+        if len(args) == 1:
+            self.desc = args[0]
+            self.role = 'SLAVE'
+            VectorPort.__init__(self, *args)
+        else:
+            raise TypeError, 'wrong number of arguments'
 
 # 'Fake' ParamDesc for Port references to assign to the _pdesc slot of
 # proxy objects (via set_param_desc()) so that proxy error messages
@@ -1549,6 +1604,7 @@ __all__ = ['Param', 'VectorParam',
            'MaxAddr', 'MaxTick', 'AllMemory',
            'Time',
            'NextEthernetAddr', 'NULL',
-           'Port', 'VectorPort']
+           'MasterPort', 'SlavePort',
+           'VectorMasterPort', 'VectorSlavePort']
 
 import SimObject
index 73124ecb9317b6bd2b0c5fe14c0d6663e1f43312..88485fcf8aa0e0c6138865ef1aaf167d5c4f0c83 100644 (file)
@@ -39,7 +39,7 @@ class MemoryMode(Enum): vals = ['invalid', 'atomic', 'timing']
 
 class System(MemObject):
     type = 'System'
-    system_port = Port("System port")
+    system_port = MasterPort("System port")
 
     @classmethod
     def export_method_cxx_predecls(cls, code):
index 2a87cb66341bbaa36698d1c272419c75fc54cf04..dcef25be89732bd763cb7eec9257822a8e476751 100644 (file)
@@ -50,8 +50,8 @@ cpu.clock = '2GHz'
 system = System(cpu = cpu,
                 physmem = PhysicalMemory(),
                 membus = Bus())
-system.system_port = system.membus.port
-system.physmem.port = system.membus.port
+system.system_port = system.membus.slave
+system.physmem.port = system.membus.master
 cpu.connectAllPorts(system.membus)
 
 root = Root(full_system = False, system = system)
index 43031dd02b3a801a97cda4bc1fda7d1622ba209c..e2c59497e35efadd7b88b82cc72c694442c4e91d 100644 (file)
@@ -91,7 +91,7 @@ for (i, ruby_port) in enumerate(system.ruby._cpu_ruby_ports):
      # Tie the cpu test and functional ports to the ruby cpu ports and
      # physmem, respectively
      #
-     cpus[i].test = ruby_port.port
+     cpus[i].test = ruby_port.slave
      cpus[i].functional = system.funcmem.port
      
      #
index edb18f39a4f4e1e4376779adaae1cc5cc8af2ec5..6fface748bb99949e8beb639ff4fad94a3147ad2 100644 (file)
@@ -63,22 +63,22 @@ system = System(cpu = cpus, funcmem = PhysicalMemory(),
 # l2cache & bus
 system.toL2Bus = Bus(clock="500GHz", width=16)
 system.l2c = L2(size='64kB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
+system.l2c.cpu_side = system.toL2Bus.master
 
 # connect l2c to membus
-system.l2c.mem_side = system.membus.port
+system.l2c.mem_side = system.membus.slave
 
 # add L1 caches
 for cpu in cpus:
     cpu.l1c = L1(size = '32kB', assoc = 4)
     cpu.l1c.cpu_side = cpu.test
-    cpu.l1c.mem_side = system.toL2Bus.port
+    cpu.l1c.mem_side = system.toL2Bus.slave
     system.funcmem.port = cpu.functional
 
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 
 # -----------------------
index cff511bf8ae4eaf6ffb80150d32b3a00347f1b57..3e5e34e71b446138751c1600059a98528f44e7f6 100644 (file)
@@ -44,10 +44,10 @@ for cpu in cpus:
     cpu.clock = '2GHz'
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 # Connect the system port for loading of binaries etc
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # -----------------------
 # run simulation
index 95323c2f63375d461506e53252341af2183a688f..1974d686f936a1ef0a77be7d93e88e9161c7510d 100644 (file)
@@ -62,10 +62,10 @@ Bus())
 # l2cache & bus
 system.toL2Bus = Bus()
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
+system.l2c.cpu_side = system.toL2Bus.master
 
 # connect l2c to membus
-system.l2c.mem_side = system.membus.port
+system.l2c.mem_side = system.membus.slave
 
 # add L1 caches
 for cpu in cpus:
@@ -76,10 +76,10 @@ for cpu in cpus:
     cpu.clock = '2GHz'
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 # connect system port to membus
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # -----------------------
 # run simulation
index 14b0ff1ab7c11deccdefd55cfb8c3a4b71643be2..0bdb734452f2e11fe4202e9477e7045b1f4cfbd9 100644 (file)
@@ -40,10 +40,10 @@ cpu.clock = '2GHz'
 system = System(cpu = cpu,
                 physmem = ruby_memory,
                 membus = Bus())
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 cpu.connectAllPorts(system.membus)
 
 # Connect the system port for loading of binaries etc
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 root = Root(full_system = False, system = system)
index 9701b10123cbc59191067dbb8103bcaf3d5a5662..3003f0bcdbf5849e9cc5dc7ea2cd7d7c8983d695 100644 (file)
@@ -50,8 +50,8 @@ cpu.clock = '2GHz'
 system = System(cpu = cpu,
                 physmem = PhysicalMemory(),
                 membus = Bus())
-system.system_port = system.membus.port
-system.physmem.port = system.membus.port
+system.system_port = system.membus.slave
+system.physmem.port = system.membus.master
 cpu.connectAllPorts(system.membus)
 
 root = Root(full_system = False, system = system)
index f3b8e700f15ecffabefcb98b0b855a6cd1c8541a..a04b0413428e82633ea1a7f5f833f75bc03cd48b 100644 (file)
@@ -87,8 +87,8 @@ mdesc = SysConfig(disk = 'linux-x86.img')
 system = FSConfig.makeLinuxX86System('timing', mdesc=mdesc)
 system.kernel = FSConfig.binary('x86_64-vmlinux-2.6.22.9')
 system.iocache = IOCache(addr_range=mem_size)
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpu
 #create the l1/l2 bus
@@ -96,8 +96,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 62c7c7bd40ff9f2c2b577b0d6ba20ea11b24e66b..24270edb00483ef605159cd8d8f9338ecfc7d836 100644 (file)
@@ -89,8 +89,8 @@ mdesc = SysConfig(disk = 'linux-x86.img')
 system = FSConfig.makeLinuxX86System('atomic', mdesc=mdesc)
 system.kernel = FSConfig.binary('x86_64-vmlinux-2.6.22.9')
 system.iocache = IOCache(addr_range=mem_size)
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpu
 #create the l1/l2 bus
@@ -98,8 +98,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index cbfda22a267688a6976f9cb62f83b8aec9df9bc0..97a607d8ec196b60bc430f1094080f1e6e38089a 100644 (file)
@@ -92,14 +92,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache(addr_range=mem_size)
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 42532065b5065101aa53dcdfe32c0e990efb7bbd..ad1c4752b8727a935497e3d7e6faad2d7f51df87 100644 (file)
@@ -72,8 +72,8 @@ cpus = [DerivO3CPU(cpu_id=i) for i in xrange(2) ]
 #the system
 system = FSConfig.makeArmSystem('timing', "RealView_PBX", None, False)
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpus
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 for c in cpus:
index f466bc480d6b02f3e61aa74b4819de82bc3ce140..058111d6708961c72ac8d7d46ac484c31e71aa9c 100644 (file)
@@ -76,14 +76,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 5baa3c91a9d2c755ac13e3c2e1602e0031b3a8f7..985f2016bc21e6dbce156555b8697c43b4eedfa6 100644 (file)
@@ -72,8 +72,8 @@ cpus = [AtomicSimpleCPU(cpu_id=i) for i in xrange(2) ]
 #the system
 system = FSConfig.makeArmSystem('atomic', "RealView_PBX", None, False)
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpus
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 system.l2c.num_cpus = 2
 
 #connect up the cpu and l1s
index f1de86411517e62fb1f77e0be964103cba106144..1e5bab50cc18ec01c89d53e4d4cfc7dec13435f2 100644 (file)
@@ -71,8 +71,8 @@ cpu = AtomicSimpleCPU(cpu_id=0)
 #the system
 system = FSConfig.makeArmSystem('atomic', "RealView_PBX", None, False)
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpu
 #create the l1/l2 bus
@@ -80,8 +80,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 95daa81b60d8c0b6e0e8558b4c6ad729e57de604..e55cb72cb4d9844fc572eafadf2289cfce4d1b4c 100644 (file)
@@ -72,8 +72,8 @@ cpus = [TimingSimpleCPU(cpu_id=i) for i in xrange(2) ]
 #the system
 system = FSConfig.makeArmSystem('timing', "RealView_PBX", None, False)
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpus
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 for c in cpus:
index 8d1840571df6ce99d616fe4ce789b9fc225f3065..1e27a5dc99adfd0c8d820a9390b2003f98761214 100644 (file)
@@ -76,14 +76,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 116afa2b62a6653f77a155f58c25e562026be9b8..c53ed26bd213c659ae9b425e8a5b4e6eb1ad4a6d 100644 (file)
@@ -88,7 +88,7 @@ for ruby_port in system.ruby._cpu_ruby_ports:
     #
     # Tie the ruby tester ports to the ruby cpu ports
     #
-    tester.cpuPort = ruby_port.port
+    tester.cpuPort = ruby_port.slave
 
     #
     # Tell the sequencer this is the ruby tester so that it
index 8b61fd1f240163b58a8764ad146ba2db15c8bd45..a9ee3c4d045ffc202b50a6266a08386b6d780b49 100644 (file)
@@ -45,10 +45,10 @@ for cpu in cpus:
     cpu.clock = '2GHz'
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 # Connect the system port for loading of binaries etc
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # -----------------------
 # run simulation
index 2fa7edb2adf2f00c523a09b6b3d27e0209ad4e6f..8bc2e6e4f913496c92c7983104ab5b67db115782 100644 (file)
@@ -61,10 +61,10 @@ Bus())
 # l2cache & bus
 system.toL2Bus = Bus()
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
+system.l2c.cpu_side = system.toL2Bus.master
 
 # connect l2c to membus
-system.l2c.mem_side = system.membus.port
+system.l2c.mem_side = system.membus.slave
 
 # add L1 caches
 for cpu in cpus:
@@ -75,10 +75,10 @@ for cpu in cpus:
     cpu.clock = '2GHz'
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 # connect system port to membus
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # -----------------------
 # run simulation
index eb7415b8da56dfda7d8cd3d7b9b1ba7f4d6f173b..5e5b94f27f19752352663e221fe2ee5bdc05860d 100644 (file)
@@ -32,8 +32,8 @@ from m5.objects import *
 system = System(cpu = AtomicSimpleCPU(cpu_id=0),
                 physmem = PhysicalMemory(),
                 membus = Bus())
-system.system_port = system.membus.port
-system.physmem.port = system.membus.port
+system.system_port = system.membus.slave
+system.physmem.port = system.membus.master
 system.cpu.connectAllPorts(system.membus)
 system.cpu.clock = '2GHz'
 
index 06d53515456afdb8eee1b801df0c1e035e8c0afc..5ec7a60678de03db94be0ab0aad0b04ff9549c58 100644 (file)
@@ -61,10 +61,10 @@ Bus())
 # l2cache & bus
 system.toL2Bus = Bus()
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
+system.l2c.cpu_side = system.toL2Bus.master
 
 # connect l2c to membus
-system.l2c.mem_side = system.membus.port
+system.l2c.mem_side = system.membus.slave
 
 # add L1 caches
 for cpu in cpus:
@@ -74,10 +74,10 @@ for cpu in cpus:
     cpu.connectAllPorts(system.toL2Bus, system.membus)
     cpu.clock = '2GHz'
 
-system.system_port = system.membus.port
+system.system_port = system.membus.slave
 
 # connect memory to membus
-system.physmem.port = system.membus.port
+system.physmem.port = system.membus.master
 
 
 # -----------------------
index 19b40fe480b80e821e34e2f39a0f5b3c5723c416..ea9428d8a2018050adcd4ecfa9918966ce957b0e 100644 (file)
@@ -46,8 +46,8 @@ cpu.addTwoLevelCacheHierarchy(MyL1Cache(size = '128kB'),
 system = System(cpu = cpu,
                 physmem = PhysicalMemory(),
                 membus = Bus())
-system.system_port = system.membus.port
-system.physmem.port = system.membus.port
+system.system_port = system.membus.slave
+system.physmem.port = system.membus.master
 cpu.connectAllPorts(system.membus)
 cpu.clock = '2GHz'
 
index dc30633b3bede2d0b0b830d205e5142eb9eb045c..0c3323f62c076b9010d8d8058f9c645ea6223308 100644 (file)
@@ -80,14 +80,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 1acfc903b217b15c71426740ba8667baaa5b9aa0..c30b1da04c19d035fa025efd0a0fd3fc7dce3984 100644 (file)
@@ -77,14 +77,14 @@ system.cpu = cpus
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 for c in cpus:
index accf350b36613cc5ef15620907f2e5bf94cd15a8..015de3d0f880fa5e8322464960c036a774ec58a8 100644 (file)
@@ -77,14 +77,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index ddc7dd1d7e639d0e67c08a34d15366f797ab4b51..08c71df3369cabc5fe54f5060b6221b36e1253ea 100644 (file)
@@ -72,8 +72,8 @@ cpus = [ AtomicSimpleCPU(cpu_id=i) for i in xrange(2) ]
 #the system
 system = FSConfig.makeLinuxAlphaSystem('atomic')
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpus
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 for c in cpus:
index 897b1c9469d35a0f5df198db7a379ac2edc4e535..69337ac14d6c1fad4dd5fe31203882c33fe54625 100644 (file)
@@ -72,8 +72,8 @@ cpu = AtomicSimpleCPU(cpu_id=0)
 #the system
 system = FSConfig.makeLinuxAlphaSystem('atomic')
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpu
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index 48740ea15ce76266f55451c7a8f9db54db56f8cf..f61a3f054cd4adaf6547c1edc44c9897582df312 100644 (file)
@@ -72,8 +72,8 @@ cpus = [ TimingSimpleCPU(cpu_id=i) for i in xrange(2) ]
 #the system
 system = FSConfig.makeLinuxAlphaSystem('timing')
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 system.cpu = cpus
 #create the l1/l2 bus
@@ -81,8 +81,8 @@ system.toL2Bus = Bus()
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 for c in cpus:
index e3a764e16ead66d7d7a76dcfe9d32f2da2a2951a..e705e35dd1b3820ff5401480f0c8e5e8fedfecd4 100644 (file)
@@ -77,14 +77,14 @@ system.cpu = cpu
 #create the l1/l2 bus
 system.toL2Bus = Bus()
 system.iocache = IOCache()
-system.iocache.cpu_side = system.iobus.port
-system.iocache.mem_side = system.membus.port
+system.iocache.cpu_side = system.iobus.master
+system.iocache.mem_side = system.membus.slave
 
 
 #connect up the l2 cache
 system.l2c = L2(size='4MB', assoc=8)
-system.l2c.cpu_side = system.toL2Bus.port
-system.l2c.mem_side = system.membus.port
+system.l2c.cpu_side = system.toL2Bus.master
+system.l2c.mem_side = system.membus.slave
 
 #connect up the cpu and l1s
 cpu.addPrivateSplitL1Caches(L1(size = '32kB', assoc = 1),
index d32e5dd872e55403b8814eb9aa8eaeaf15b3d69f..552acc0e1007bf13d7f7c8ec018746a57ad4ff7c 100644 (file)
@@ -41,8 +41,8 @@ test_sys.cpu.connectAllPorts(test_sys.membus)
 # from masters on the IO bus to the memory bus
 test_sys.iobridge = Bridge(delay='50ns', nack_delay='4ns',
                            ranges = [AddrRange(0, '8GB')])
-test_sys.iobridge.slave = test_sys.iobus.port
-test_sys.iobridge.master = test_sys.membus.port
+test_sys.iobridge.slave = test_sys.iobus.master
+test_sys.iobridge.master = test_sys.membus.slave
 
 drive_sys = makeLinuxAlphaSystem('atomic',
                                  SysConfig('netperf-server.rcS'))
@@ -50,8 +50,8 @@ drive_sys.cpu = AtomicSimpleCPU(cpu_id=0)
 drive_sys.cpu.connectAllPorts(drive_sys.membus)
 drive_sys.iobridge = Bridge(delay='50ns', nack_delay='4ns',
                             ranges = [AddrRange(0, '8GB')])
-drive_sys.iobridge.slave = drive_sys.iobus.port
-drive_sys.iobridge.master = drive_sys.membus.port
+drive_sys.iobridge.slave = drive_sys.iobus.master
+drive_sys.iobridge.master = drive_sys.membus.slave
 
 root = makeDualRoot(True, test_sys, drive_sys, "ethertrace")