arch, cpu, dev, gpu, mem, sim, python: start using getPort.
authorGabe Black <gabeblack@google.com>
Thu, 7 Mar 2019 11:02:35 +0000 (03:02 -0800)
committerGabe Black <gabeblack@google.com>
Tue, 19 Mar 2019 10:22:50 +0000 (10:22 +0000)
Replace the getMasterPort, getSlavePort, and getEthPort functions
with getPort, and remove extraneous mechanisms that are no longer
necessary.

Change-Id: Iab7e3c02d2f3a0cf33e7e824e18c28646b5bc318
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17040
Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br>
Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com>
Maintainer: Andreas Sandberg <andreas.sandberg@arm.com>

110 files changed:
src/arch/arm/table_walker.cc
src/arch/arm/table_walker.hh
src/arch/arm/tlb.cc
src/arch/arm/tlb.hh
src/arch/generic/tlb.hh
src/arch/x86/interrupts.hh
src/arch/x86/pagetable_walker.cc
src/arch/x86/pagetable_walker.hh
src/arch/x86/tlb.cc
src/arch/x86/tlb.hh
src/cpu/base.cc
src/cpu/base.hh
src/cpu/testers/directedtest/RubyDirectedTester.cc
src/cpu/testers/directedtest/RubyDirectedTester.hh
src/cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.cc
src/cpu/testers/garnet_synthetic_traffic/GarnetSyntheticTraffic.hh
src/cpu/testers/memtest/memtest.cc
src/cpu/testers/memtest/memtest.hh
src/cpu/testers/rubytest/RubyTester.cc
src/cpu/testers/rubytest/RubyTester.hh
src/cpu/testers/traffic_gen/base.cc
src/cpu/testers/traffic_gen/base.hh
src/cpu/trace/trace_cpu.cc
src/dev/dma_device.cc
src/dev/dma_device.hh
src/dev/io_device.cc
src/dev/io_device.hh
src/dev/net/Ethernet.py
src/dev/net/SConscript
src/dev/net/dist_etherlink.cc
src/dev/net/dist_etherlink.hh
src/dev/net/etherbus.cc
src/dev/net/etherbus.hh
src/dev/net/etherdevice.hh
src/dev/net/etherlink.cc
src/dev/net/etherlink.hh
src/dev/net/etherobject.hh [deleted file]
src/dev/net/etherswitch.cc
src/dev/net/etherswitch.hh
src/dev/net/ethertap.cc
src/dev/net/ethertap.hh
src/dev/net/i8254xGBe.cc
src/dev/net/i8254xGBe.hh
src/dev/net/ns_gige.cc
src/dev/net/ns_gige.hh
src/dev/net/python.cc [deleted file]
src/dev/net/sinic.cc
src/dev/net/sinic.hh
src/dev/pci/copy_engine.cc
src/dev/pci/copy_engine.hh
src/dev/x86/i82094aa.cc
src/dev/x86/i82094aa.hh
src/gpu-compute/compute_unit.hh
src/gpu-compute/dispatcher.cc
src/gpu-compute/dispatcher.hh
src/gpu-compute/gpu_tlb.cc
src/gpu-compute/gpu_tlb.hh
src/gpu-compute/lds_state.hh
src/gpu-compute/tlb_coalescer.cc
src/gpu-compute/tlb_coalescer.hh
src/learning_gem5/part2/simple_cache.cc
src/learning_gem5/part2/simple_cache.hh
src/learning_gem5/part2/simple_memobj.cc
src/learning_gem5/part2/simple_memobj.hh
src/mem/addr_mapper.cc
src/mem/addr_mapper.hh
src/mem/bridge.cc
src/mem/bridge.hh
src/mem/cache/base.cc
src/mem/cache/base.hh
src/mem/comm_monitor.cc
src/mem/comm_monitor.hh
src/mem/dram_ctrl.cc
src/mem/dram_ctrl.hh
src/mem/dramsim2.cc
src/mem/dramsim2.hh
src/mem/external_master.cc
src/mem/external_master.hh
src/mem/external_slave.cc
src/mem/external_slave.hh
src/mem/mem_checker_monitor.cc
src/mem/mem_checker_monitor.hh
src/mem/mem_delay.cc
src/mem/mem_delay.hh
src/mem/mem_object.cc
src/mem/mem_object.hh
src/mem/qos/mem_sink.cc
src/mem/qos/mem_sink.hh
src/mem/ruby/network/MessageBuffer.hh
src/mem/ruby/network/Network.hh
src/mem/ruby/network/dummy_port.hh [new file with mode: 0644]
src/mem/ruby/slicc_interface/AbstractController.cc
src/mem/ruby/slicc_interface/AbstractController.hh
src/mem/ruby/system/RubyPort.cc
src/mem/ruby/system/RubyPort.hh
src/mem/serial_link.cc
src/mem/serial_link.hh
src/mem/simple_mem.cc
src/mem/simple_mem.hh
src/mem/xbar.cc
src/mem/xbar.hh
src/python/SConscript
src/python/pybind11/pybind.hh
src/python/pybind11/pyobject.cc [deleted file]
src/sim/SConscript
src/sim/cxx_manager.cc
src/sim/init.cc
src/sim/python.cc [new file with mode: 0644]
src/sim/system.cc
src/sim/system.hh

index 1a7b5d37526bb8a15ca97dbb26664df667683b18..21257de59ede1a390c6251036a90dad9e1419926 100644 (file)
@@ -114,8 +114,8 @@ TableWalker::init()
     fatal_if(!tlb, "Table walker must have a valid TLB\n");
 }
 
-BaseMasterPort&
-TableWalker::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+TableWalker::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port") {
         if (!isStage2) {
@@ -124,7 +124,7 @@ TableWalker::getMasterPort(const std::string &if_name, PortID idx)
             fatal("Cannot access table walker port through stage-two walker\n");
         }
     }
-    return MemObject::getMasterPort(if_name, idx);
+    return MemObject::getPort(if_name, idx);
 }
 
 TableWalker::WalkerState::WalkerState() :
index 57e3aed06d14eae0e35ca67fca74b86fcf50ebb0..8176fc7f55b729ebbdcda7ecdfaccf63f9b6b972 100644 (file)
@@ -889,8 +889,8 @@ class TableWalker : public MemObject
     DrainState drain() override;
     void drainResume() override;
 
-    BaseMasterPort& getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     void regStats() override;
 
index ed7e680396e8d8437b5f28f959c7312545721a75..dc3c35bab9ee85ee93b8657ba10b28c93032aa02 100644 (file)
@@ -1243,8 +1243,8 @@ TLB::translateComplete(const RequestPtr &req, ThreadContext *tc,
     return fault;
 }
 
-BaseMasterPort*
-TLB::getTableWalkerMasterPort()
+Port *
+TLB::getTableWalkerPort()
 {
     return &stage2Mmu->getPort();
 }
index 8ca176a823fa285780aeab95e4f981ac6fe0c2a8..fa1b040698869aa7af866108f4f7a178a772af4b 100644 (file)
@@ -392,7 +392,7 @@ class TLB : public BaseTLB
     void regProbePoints() override;
 
     /**
-     * Get the table walker master port. This is used for migrating
+     * Get the table walker port. This is used for migrating
      * port connections during a CPU takeOverFrom() call. For
      * architectures that do not have a table walker, NULL is
      * returned, hence the use of a pointer rather than a
@@ -401,7 +401,7 @@ class TLB : public BaseTLB
      *
      * @return A pointer to the walker master port
      */
-    BaseMasterPort* getTableWalkerMasterPort() override;
+    Port *getTableWalkerPort() override;
 
     // Caching misc register values here.
     // Writing to misc registers needs to invalidate them.
index 7865d8abee264992bcccd4c4cf8a6fd24732060d..ba07b1057ce8d02c621df15edbcc9b33f2b3ce0a 100644 (file)
@@ -131,15 +131,15 @@ class BaseTLB : public MemObject
     virtual void takeOverFrom(BaseTLB *otlb) = 0;
 
     /**
-     * Get the table walker master port if present. This is used for
+     * Get the table walker port if present. This is used for
      * migrating port connections during a CPU takeOverFrom()
      * call. For architectures that do not have a table walker, NULL
      * is returned, hence the use of a pointer rather than a
      * reference.
      *
-     * @return A pointer to the walker master port or NULL if not present
+     * @return A pointer to the walker port or NULL if not present
      */
-    virtual BaseMasterPort* getTableWalkerMasterPort() { return NULL; }
+    virtual Port* getTableWalkerPort() { return NULL; }
 
     void memInvalidate() { flushAll(); }
 };
index bfd188961c5c9c1075a8800ff6c3b1dd6ceeb80a..dfdff2b3f6ab3f5944e583923481067a5ed52631 100644 (file)
@@ -215,22 +215,15 @@ class Interrupts : public BasicPioDevice, IntDevice
 
     AddrRangeList getIntAddrRange() const override;
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override
     {
         if (if_name == "int_master") {
             return intMasterPort;
-        }
-        return BasicPioDevice::getMasterPort(if_name, idx);
-    }
-
-    BaseSlavePort &getSlavePort(const std::string &if_name,
-                                PortID idx = InvalidPortID) override
-    {
-        if (if_name == "int_slave") {
+        } else if (if_name == "int_slave") {
             return intSlavePort;
         }
-        return BasicPioDevice::getSlavePort(if_name, idx);
+        return BasicPioDevice::getPort(if_name, idx);
     }
 
     /*
index 4a405f25f70829d7568bb464210d9043261482f4..0741dc2ed831d3e8f34ea6f9186200bb6f59864b 100644 (file)
@@ -167,13 +167,13 @@ bool Walker::sendTiming(WalkerState* sendingState, PacketPtr pkt)
 
 }
 
-BaseMasterPort &
-Walker::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+Walker::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port")
         return port;
     else
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
index edca24795d7d2a9bd8637eaefbe09a483f27bfd0..c1f4ed2c433fa3934b6ccdaaea644fa07339052d 100644 (file)
@@ -160,8 +160,8 @@ namespace X86ISA
                 const RequestPtr &req, BaseTLB::Mode mode);
         Fault startFunctional(ThreadContext * _tc, Addr &addr,
                 unsigned &logBytes, BaseTLB::Mode mode);
-        BaseMasterPort &getMasterPort(const std::string &if_name,
-                                      PortID idx = InvalidPortID);
+        Port &getPort(const std::string &if_name,
+                      PortID idx=InvalidPortID) override;
 
       protected:
         // The TLB we're supposed to load.
index 59fd3f00af7ffb2a246f110f69af631cb65c3e9d..33de0583e71cb3c20c3126ac6384eaeb75007ab8 100644 (file)
@@ -511,10 +511,10 @@ TLB::unserialize(CheckpointIn &cp)
     }
 }
 
-BaseMasterPort *
-TLB::getTableWalkerMasterPort()
+Port *
+TLB::getTableWalkerPort()
 {
-    return &walker->getMasterPort("port");
+    return &walker->getPort("port");
 }
 
 } // namespace X86ISA
index 8894a1e4ac4c7ef1ceed2d1495240ca8cd50eca8..b969bca9de06f451ca9dddfa7de3d741a26d10e0 100644 (file)
@@ -156,16 +156,16 @@ namespace X86ISA
         void unserialize(CheckpointIn &cp) override;
 
         /**
-         * Get the table walker master port. This is used for
+         * Get the table walker port. This is used for
          * migrating port connections during a CPU takeOverFrom()
          * call. For architectures that do not have a table walker,
          * NULL is returned, hence the use of a pointer rather than a
          * reference. For X86 this method will always return a valid
          * port pointer.
          *
-         * @return A pointer to the walker master port
+         * @return A pointer to the walker port
          */
-        BaseMasterPort *getTableWalkerMasterPort() override;
+        Port *getTableWalkerPort() override;
     };
 }
 
index 09de64646a4a9d9318a865a0c8fadcf74275f382..8dfcf3cda5e5291be214d47e9a1c3e3292be7085 100644 (file)
@@ -449,19 +449,18 @@ BaseCPU::regStats()
         threadContexts[0]->regStats(name());
 }
 
-BaseMasterPort &
-BaseCPU::getMasterPort(const string &if_name, PortID idx)
+Port &
+BaseCPU::getPort(const string &if_name, PortID idx)
 {
     // Get the right port based on name. This applies to all the
     // subclasses of the base CPU and relies on their implementation
-    // of getDataPort and getInstPort. In all cases there methods
-    // return a MasterPort pointer.
+    // of getDataPort and getInstPort.
     if (if_name == "dcache_port")
         return getDataPort();
     else if (if_name == "icache_port")
         return getInstPort();
     else
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
@@ -621,21 +620,18 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
             ThreadContext::compare(oldTC, newTC);
         */
 
-        BaseMasterPort *old_itb_port =
-            oldTC->getITBPtr()->getTableWalkerMasterPort();
-        BaseMasterPort *old_dtb_port =
-            oldTC->getDTBPtr()->getTableWalkerMasterPort();
-        BaseMasterPort *new_itb_port =
-            newTC->getITBPtr()->getTableWalkerMasterPort();
-        BaseMasterPort *new_dtb_port =
-            newTC->getDTBPtr()->getTableWalkerMasterPort();
+        Port *old_itb_port = oldTC->getITBPtr()->getTableWalkerPort();
+        Port *old_dtb_port = oldTC->getDTBPtr()->getTableWalkerPort();
+        Port *new_itb_port = newTC->getITBPtr()->getTableWalkerPort();
+        Port *new_dtb_port = newTC->getDTBPtr()->getTableWalkerPort();
 
         // Move over any table walker ports if they exist
         if (new_itb_port) {
             assert(!new_itb_port->isConnected());
             assert(old_itb_port);
             assert(old_itb_port->isConnected());
-            BaseSlavePort &slavePort = old_itb_port->getSlavePort();
+            auto &slavePort =
+                dynamic_cast<BaseMasterPort *>(old_itb_port)->getSlavePort();
             old_itb_port->unbind();
             new_itb_port->bind(slavePort);
         }
@@ -643,7 +639,8 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
             assert(!new_dtb_port->isConnected());
             assert(old_dtb_port);
             assert(old_dtb_port->isConnected());
-            BaseSlavePort &slavePort = old_dtb_port->getSlavePort();
+            auto &slavePort =
+                dynamic_cast<BaseMasterPort *>(old_dtb_port)->getSlavePort();
             old_dtb_port->unbind();
             new_dtb_port->bind(slavePort);
         }
@@ -655,14 +652,14 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
         CheckerCPU *oldChecker = oldTC->getCheckerCpuPtr();
         CheckerCPU *newChecker = newTC->getCheckerCpuPtr();
         if (oldChecker && newChecker) {
-            BaseMasterPort *old_checker_itb_port =
-                oldChecker->getITBPtr()->getTableWalkerMasterPort();
-            BaseMasterPort *old_checker_dtb_port =
-                oldChecker->getDTBPtr()->getTableWalkerMasterPort();
-            BaseMasterPort *new_checker_itb_port =
-                newChecker->getITBPtr()->getTableWalkerMasterPort();
-            BaseMasterPort *new_checker_dtb_port =
-                newChecker->getDTBPtr()->getTableWalkerMasterPort();
+            Port *old_checker_itb_port =
+                oldChecker->getITBPtr()->getTableWalkerPort();
+            Port *old_checker_dtb_port =
+                oldChecker->getDTBPtr()->getTableWalkerPort();
+            Port *new_checker_itb_port =
+                newChecker->getITBPtr()->getTableWalkerPort();
+            Port *new_checker_dtb_port =
+                newChecker->getDTBPtr()->getTableWalkerPort();
 
             newChecker->getITBPtr()->takeOverFrom(oldChecker->getITBPtr());
             newChecker->getDTBPtr()->takeOverFrom(oldChecker->getDTBPtr());
@@ -672,8 +669,9 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
                 assert(!new_checker_itb_port->isConnected());
                 assert(old_checker_itb_port);
                 assert(old_checker_itb_port->isConnected());
-                BaseSlavePort &slavePort =
-                    old_checker_itb_port->getSlavePort();
+                auto &slavePort =
+                    dynamic_cast<BaseMasterPort *>(old_checker_itb_port)->
+                    getSlavePort();
                 old_checker_itb_port->unbind();
                 new_checker_itb_port->bind(slavePort);
             }
@@ -681,8 +679,9 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
                 assert(!new_checker_dtb_port->isConnected());
                 assert(old_checker_dtb_port);
                 assert(old_checker_dtb_port->isConnected());
-                BaseSlavePort &slavePort =
-                    old_checker_dtb_port->getSlavePort();
+                auto &slavePort =
+                    dynamic_cast<BaseMasterPort *>(old_checker_dtb_port)->
+                    getSlavePort();
                 old_checker_dtb_port->unbind();
                 new_checker_dtb_port->bind(slavePort);
             }
@@ -709,13 +708,15 @@ BaseCPU::takeOverFrom(BaseCPU *oldCPU)
     // we are switching to.
     assert(!getInstPort().isConnected());
     assert(oldCPU->getInstPort().isConnected());
-    BaseSlavePort &inst_peer_port = oldCPU->getInstPort().getSlavePort();
+    auto &inst_peer_port =
+        dynamic_cast<BaseMasterPort &>(oldCPU->getInstPort()).getSlavePort();
     oldCPU->getInstPort().unbind();
     getInstPort().bind(inst_peer_port);
 
     assert(!getDataPort().isConnected());
     assert(oldCPU->getDataPort().isConnected());
-    BaseSlavePort &data_peer_port = oldCPU->getDataPort().getSlavePort();
+    auto &data_peer_port =
+        dynamic_cast<BaseMasterPort &>(oldCPU->getDataPort()).getSlavePort();
     oldCPU->getDataPort().unbind();
     getDataPort().bind(data_peer_port);
 }
index 8673d2330a353c6fdfadd97f6204d4732c75f3c5..9075d4b337e8cd9deadf41bac94f55f4249f4e14 100644 (file)
@@ -180,7 +180,7 @@ class BaseCPU : public MemObject
     MasterID instMasterId() { return _instMasterId; }
 
     /**
-     * Get a master port on this CPU. All CPUs have a data and
+     * Get a port on this CPU. All CPUs have a data and
      * instruction port, and this method uses getDataPort and
      * getInstPort of the subclasses to resolve the two ports.
      *
@@ -189,8 +189,8 @@ class BaseCPU : public MemObject
      *
      * @return a reference to the port with the given name
      */
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /** Get cpu task id */
     uint32_t taskId() const { return _taskId; }
index be7f3c2560df3b88a601af691ba6abc134f7a41b..cd367b4985bd8166fa76c778e8b8f64ae9a29493 100644 (file)
@@ -78,15 +78,15 @@ RubyDirectedTester::init()
     generator->setDirectedTester(this);
 }
 
-BaseMasterPort &
-RubyDirectedTester::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+RubyDirectedTester::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name != "cpuPort") {
         // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     } else {
         if (idx >= static_cast<int>(ports.size())) {
-            panic("RubyDirectedTester::getMasterPort: unknown index %d\n", idx);
+            panic("RubyDirectedTester::getPort: unknown index %d\n", idx);
         }
 
         return *ports[idx];
index 00278a65e420889725e5e2a70571329c4e9b1b2c..0f519762cb244fca50cbf0e3c811cd5dad76ebfd 100644 (file)
@@ -67,8 +67,8 @@ class RubyDirectedTester : public MemObject
     RubyDirectedTester(const Params *p);
     ~RubyDirectedTester();
 
-    virtual BaseMasterPort &getMasterPort(const std::string &if_name,
-                                          PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     MasterPort* getCpuPort(int idx);
 
index 0ced9df8407b7d6bb1132c29ddde1b2c03395f7c..1a07205e68ca372b68d859f40a0a57b1ec682be5 100644 (file)
@@ -110,13 +110,13 @@ GarnetSyntheticTraffic::GarnetSyntheticTraffic(const Params *p)
             name(), id);
 }
 
-BaseMasterPort &
-GarnetSyntheticTraffic::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+GarnetSyntheticTraffic::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "test")
         return cachePort;
     else
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
index 3da7e27742d46199fd6dce635923fae74223e5a2..a18f5bbdad96014e1e30f65bb17be42d5f20b49f 100644 (file)
@@ -64,8 +64,8 @@ class GarnetSyntheticTraffic : public MemObject
     // main simulation loop (one cycle)
     void tick();
 
-    virtual BaseMasterPort &getMasterPort(const std::string &if_name,
-                                          PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /**
      * Print state of address in memory system via PrintReq (for
index 09e7e88a14b52a332f145f54375d766a521bb16e..346f88246c0bef8bbec93bee495a44dd3f0a45a9 100644 (file)
@@ -124,13 +124,13 @@ MemTest::MemTest(const Params *p)
     schedule(noResponseEvent, clockEdge(progressCheck));
 }
 
-BaseMasterPort &
-MemTest::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+MemTest::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port")
         return port;
     else
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
index 023b878c988248d8abc7d73229abebe0623b1be3..8e8f739968e12d31926c464933a7a98fbe944bd9 100644 (file)
@@ -77,8 +77,8 @@ class MemTest : public MemObject
 
     virtual void regStats();
 
-    virtual BaseMasterPort &getMasterPort(const std::string &if_name,
-                                          PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
   protected:
 
index 93754467d8b4382e2c73bac03231994f98d4179e..cb23688c4aca44b9c43d661550f67ff97fcca962 100644 (file)
@@ -128,17 +128,17 @@ RubyTester::init()
     m_checkTable_ptr = new CheckTable(m_num_writers, m_num_readers, this);
 }
 
-BaseMasterPort &
-RubyTester::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+RubyTester::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name != "cpuInstPort" && if_name != "cpuInstDataPort" &&
         if_name != "cpuDataPort") {
         // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     } else {
         if (if_name == "cpuInstPort") {
             if (idx > m_num_inst_only_ports) {
-                panic("RubyTester::getMasterPort: unknown inst port %d\n",
+                panic("RubyTester::getPort: unknown inst port %d\n",
                       idx);
             }
             //
@@ -147,7 +147,7 @@ RubyTester::getMasterPort(const std::string &if_name, PortID idx)
             return *readPorts[idx];
         } else if (if_name == "cpuInstDataPort") {
             if (idx > m_num_inst_data_ports) {
-                panic("RubyTester::getMasterPort: unknown inst+data port %d\n",
+                panic("RubyTester::getPort: unknown inst+data port %d\n",
                       idx);
             }
             int read_idx = idx + m_num_inst_only_ports;
@@ -162,7 +162,7 @@ RubyTester::getMasterPort(const std::string &if_name, PortID idx)
             //
             if (idx > (static_cast<int>(readPorts.size()) -
                        (m_num_inst_only_ports + m_num_inst_data_ports))) {
-                panic("RubyTester::getMasterPort: unknown data port %d\n",
+                panic("RubyTester::getPort: unknown data port %d\n",
                       idx);
             }
             int read_idx = idx + m_num_inst_only_ports + m_num_inst_data_ports;
index 007035977574255b1e63d182227649b37008a1f1..2509aa2cd1bbfb9ded0e265e95d82855d65e4379 100644 (file)
@@ -94,8 +94,8 @@ class RubyTester : public MemObject
     RubyTester(const Params *p);
     ~RubyTester();
 
-    virtual BaseMasterPort &getMasterPort(const std::string &if_name,
-                                          PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     bool isInstOnlyCpuPort(int idx);
     bool isInstDataCpuPort(int idx);
index ad4f67d9d5c5fa2f29d286ef8620c0da8d4a6144..80fa8a9d6b7b0a836f13ae3f18c951f944b14da9 100644 (file)
@@ -88,13 +88,13 @@ BaseTrafficGen::~BaseTrafficGen()
 {
 }
 
-BaseMasterPort&
-BaseTrafficGen::getMasterPort(const string& if_name, PortID idx)
+Port &
+BaseTrafficGen::getPort(const string &if_name, PortID idx)
 {
     if (if_name == "port") {
         return port;
     } else {
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index 272dcb587703569cda99de4054c99667a256d9c3..2443e62236c6b3acd5ef8558b7f9ffc257bd9866 100644 (file)
@@ -182,8 +182,8 @@ class BaseTrafficGen : public MemObject
 
     ~BaseTrafficGen();
 
-    BaseMasterPort& getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     void init() override;
 
index 2b198e9665f0f4535faf951567377a0b451eef7e..6e499dbaccc0198e87e082054352b5fd799c8364 100644 (file)
@@ -108,13 +108,13 @@ TraceCPU::takeOverFrom(BaseCPU *oldCPU)
     // Unbind the ports of the old CPU and bind the ports of the TraceCPU.
     assert(!getInstPort().isConnected());
     assert(oldCPU->getInstPort().isConnected());
-    BaseSlavePort &inst_peer_port = oldCPU->getInstPort().getSlavePort();
+    Port &inst_peer_port = oldCPU->getInstPort().getSlavePort();
     oldCPU->getInstPort().unbind();
     getInstPort().bind(inst_peer_port);
 
     assert(!getDataPort().isConnected());
     assert(oldCPU->getDataPort().isConnected());
-    BaseSlavePort &data_peer_port = oldCPU->getDataPort().getSlavePort();
+    Port &data_peer_port = oldCPU->getDataPort().getSlavePort();
     oldCPU->getDataPort().unbind();
     getDataPort().bind(data_peer_port);
 }
index c445fbc779758fc772bbe54058f806f4da07fc67..047eef1d70d91c256cb8a8623a22191d492ac58d 100644 (file)
@@ -262,13 +262,13 @@ DmaPort::sendDma()
         panic("Unknown memory mode.");
 }
 
-BaseMasterPort &
-DmaDevice::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+DmaDevice::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "dma") {
         return dmaPort;
     }
-    return PioDevice::getMasterPort(if_name, idx);
+    return PioDevice::getPort(if_name, idx);
 }
 
 
index 0dc79df4227e50f41244be4de452bca053610579..f556e14e30e97ec14dd4fccdfe8b06b2c8167e02 100644 (file)
@@ -179,8 +179,8 @@ class DmaDevice : public PioDevice
 
     unsigned int cacheBlockSize() const { return sys->cacheLineSize(); }
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
 };
 
index 28ea52aad6b5b729d3d092dbac56db2447038107..1cec2bf4acd34d0380b4af7ec5439ee06176fac7 100644 (file)
@@ -87,13 +87,13 @@ PioDevice::init()
     pioPort.sendRangeChange();
 }
 
-BaseSlavePort &
-PioDevice::getSlavePort(const std::string &if_name, PortID idx)
+Port &
+PioDevice::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "pio") {
         return pioPort;
     }
-    return MemObject::getSlavePort(if_name, idx);
+    return MemObject::getPort(if_name, idx);
 }
 
 BasicPioDevice::BasicPioDevice(const Params *p, Addr size)
index 7e323b3bccc7cd11c3dba15b94593a0073da484a..64d7aa5ec45407d07967a0b50f866952c3645ced 100644 (file)
@@ -125,8 +125,8 @@ class PioDevice : public MemObject
 
     virtual void init();
 
-    virtual BaseSlavePort &getSlavePort(const std::string &if_name,
-                                        PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+            PortID idx=InvalidPortID) override;
 
     friend class PioPort;
 
index 0cf37e230c6eedd213bd7c120605c12c8cdd2251..7ef83744c7742c9511d56c85d59bb6e0c27b441e 100644 (file)
@@ -47,7 +47,6 @@ from m5.objects.PciDevice import PciDevice
 class EtherLink(SimObject):
     type = 'EtherLink'
     cxx_header = "dev/net/etherlink.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     int0 = SlavePort("interface 0")
     int1 = SlavePort("interface 1")
     delay = Param.Latency('0us', "packet transmit delay")
@@ -58,7 +57,6 @@ class EtherLink(SimObject):
 class DistEtherLink(SimObject):
     type = 'DistEtherLink'
     cxx_header = "dev/net/dist_etherlink.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     int0 = SlavePort("interface 0")
     delay = Param.Latency('0us', "packet transmit delay")
     delay_var = Param.Latency('0ns', "packet transmit delay variability")
@@ -77,7 +75,6 @@ class DistEtherLink(SimObject):
 class EtherBus(SimObject):
     type = 'EtherBus'
     cxx_header = "dev/net/etherbus.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     loopback = Param.Bool(True, "send packet back to the sending interface")
     dump = Param.EtherDump(NULL, "dump object")
     speed = Param.NetworkBandwidth('100Mbps', "bus speed in bits per second")
@@ -85,7 +82,6 @@ class EtherBus(SimObject):
 class EtherSwitch(SimObject):
     type = 'EtherSwitch'
     cxx_header = "dev/net/etherswitch.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     dump = Param.EtherDump(NULL, "dump object")
     fabric_speed = Param.NetworkBandwidth('10Gbps', "switch fabric speed in bits "
                                           "per second")
@@ -99,7 +95,6 @@ class EtherTapBase(SimObject):
     type = 'EtherTapBase'
     abstract = True
     cxx_header = "dev/net/ethertap.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     bufsz = Param.Int(10000, "tap buffer size")
     dump = Param.EtherDump(NULL, "dump object")
     tap = SlavePort("Ethernet interface to connect to gem5's network")
@@ -127,7 +122,6 @@ class EtherDevice(PciDevice):
     type = 'EtherDevice'
     abstract = True
     cxx_header = "dev/net/etherdevice.hh"
-    cxx_extra_bases = [ "EtherObject" ]
     interface = MasterPort("Ethernet Interface")
 
 class IGbE(EtherDevice):
index 0bb6bbf01a75a1b5874867e1de3cbc6b68d4587d..908dd44e690e2a8f748bcd9659ba3add12467d0e 100644 (file)
@@ -45,7 +45,6 @@
 Import('*')
 
 SimObject('Ethernet.py')
-Source('python.cc', add_tags='python')
 
 # Basic Ethernet infrastructure
 Source('etherbus.cc')
index 477ad61b34a3a5f8118e1b52dceed95e614713dc..0cefb90fdcf8bb593f625a80eaf21a207c28dc78 100644 (file)
@@ -61,7 +61,6 @@
 #include "dev/net/etherdump.hh"
 #include "dev/net/etherint.hh"
 #include "dev/net/etherlink.hh"
-#include "dev/net/etherobject.hh"
 #include "dev/net/etherpkt.hh"
 #include "dev/net/tcp_iface.hh"
 #include "params/EtherLink.hh"
@@ -109,15 +108,12 @@ DistEtherLink::~DistEtherLink()
     delete distIface;
 }
 
-EtherInt*
-DistEtherLink::getEthPort(const std::string &if_name, int idx)
+Port &
+DistEtherLink::getPort(const std::string &if_name, PortID idx)
 {
-    if (if_name != "int0") {
-        return nullptr;
-    } else {
-        panic_if(localIface->getPeer(), "interface already connected to");
-    }
-    return localIface;
+    if (if_name == "int0")
+        return *localIface;
+    return SimObject::getPort(if_name, idx);
 }
 
 void
index 51852a519f83007786591124319dd223c4f70b81..7d00602c9d35d4d46638343cf7e2a39c5f7ff9f3 100644 (file)
@@ -53,7 +53,6 @@
 #include <iostream>
 
 #include "dev/net/etherlink.hh"
-#include "dev/net/etherobject.hh"
 #include "params/DistEtherLink.hh"
 
 class DistIface;
@@ -62,7 +61,7 @@ class EthPacketData;
 /**
  * Model for a fixed bandwidth full duplex ethernet link.
  */
-class DistEtherLink : public SimObject, public EtherObject
+class DistEtherLink : public SimObject
 {
   protected:
     class LocalIface;
@@ -224,7 +223,8 @@ class DistEtherLink : public SimObject, public EtherObject
         return dynamic_cast<const Params *>(_params);
     }
 
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void init() override;
     virtual void startup() override;
index dee772cc0b69b099a582830820ca386a854052e0..fa49b9900f70241f8e0d6461c1886d7579c1c057 100644 (file)
@@ -81,8 +81,8 @@ EtherBus::txDone()
     packet = 0;
 }
 
-EtherInt*
-EtherBus::getEthPort(const std::string &if_name, int idx)
+Port &
+EtherBus::getPort(const std::string &if_name, PortID idx)
 {
     panic("Etherbus doesn't work\n");
 }
index 8c1260fc58e1c991923fb548733ed988dcdd063e..24333b53d061c5343a252e4a522d998e5551f714 100644 (file)
@@ -35,7 +35,6 @@
 #ifndef __DEV_NET_ETHERBUS_HH__
 #define __DEV_NET_ETHERBUS_HH__
 
-#include "dev/net/etherobject.hh"
 #include "dev/net/etherpkt.hh"
 #include "params/EtherBus.hh"
 #include "sim/eventq.hh"
@@ -43,7 +42,7 @@
 
 class EtherDump;
 class EtherInt;
-class EtherBus : public SimObject, public EtherObject
+class EtherBus : public SimObject
 {
   protected:
     typedef std::list<EtherInt *> devlist_t;
@@ -72,7 +71,8 @@ class EtherBus : public SimObject, public EtherObject
     void reg(EtherInt *dev);
     bool busy() const { return (bool)packet; }
     bool send(EtherInt *sender, EthPacketPtr &packet);
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 };
 
 #endif // __DEV_NET_ETHERBUS_HH__
index 7101ec80a13e2427c6c4e47f665d289e3e98a143..7de4d82a41c866c8d2ac77553468c4e54b2923a4 100644 (file)
@@ -37,7 +37,6 @@
 #define __DEV_NET_ETHERDEVICE_HH__
 
 #include "base/statistics.hh"
-#include "dev/net/etherobject.hh"
 #include "dev/pci/device.hh"
 #include "params/EtherDevBase.hh"
 #include "params/EtherDevice.hh"
@@ -45,7 +44,7 @@
 
 class EtherInt;
 
-class EtherDevice : public PciDevice, public EtherObject
+class EtherDevice : public PciDevice
 {
   public:
     typedef EtherDeviceParams Params;
index b160e29d5b96d42c324d3b322c197c8bff8b753e..448bb885616ce4ae6dc7ee70a2782ea3262e2ac8 100644 (file)
@@ -88,20 +88,14 @@ EtherLink::~EtherLink()
     delete interface[1];
 }
 
-EtherInt*
-EtherLink::getEthPort(const std::string &if_name, int idx)
+Port &
+EtherLink::getPort(const std::string &if_name, PortID idx)
 {
-    Interface *i;
     if (if_name == "int0")
-        i = interface[0];
+        return *interface[0];
     else if (if_name == "int1")
-        i = interface[1];
-    else
-        return NULL;
-    if (i->getPeer())
-        panic("interface already connected to\n");
-
-    return i;
+        return *interface[1];
+    return SimObject::getPort(if_name, idx);
 }
 
 
index 37fa16859bb72612311c343955204b3a5e571e12..9f12ca46156e8a1eb62eddb188380138e9491267 100644 (file)
@@ -51,7 +51,6 @@
 
 #include "base/types.hh"
 #include "dev/net/etherint.hh"
-#include "dev/net/etherobject.hh"
 #include "dev/net/etherpkt.hh"
 #include "params/EtherLink.hh"
 #include "sim/eventq.hh"
@@ -62,7 +61,7 @@ class Checkpoint;
 /*
  * Model for a fixed bandwidth full duplex ethernet link
  */
-class EtherLink : public EtherObject, public SimObject
+class EtherLink : public SimObject
 {
   protected:
     class Interface;
@@ -152,7 +151,8 @@ class EtherLink : public EtherObject, public SimObject
         return dynamic_cast<const Params *>(_params);
     }
 
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     void serialize(CheckpointOut &cp) const override;
     void unserialize(CheckpointIn &cp) override;
diff --git a/src/dev/net/etherobject.hh b/src/dev/net/etherobject.hh
deleted file mode 100644 (file)
index 638c506..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2007 The Regents of The University of Michigan
- * Copyright 2019 Google, Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Ali Saidi
- *          Gabe Black
- */
-
-/**
- * @file
- * Base Ethernet Object declaration.
- */
-
-#ifndef __DEV_NET_ETHEROBJECT_HH__
-#define __DEV_NET_ETHEROBJECT_HH__
-
-#include <string>
-
-class EtherInt;
-
-/**
- * The base EtherObject interface.
- */
-class EtherObject
-{
-  public:
-    virtual EtherInt *getEthPort(const std::string &if_name, int idx=-1) = 0;
-};
-
-#endif // __DEV_NET_ETHEROBJECT_HH__
index c03b59435328c15f586da40f61932ef4bf3d80d2..99e0621a276f85cf3c2f06db940ed6db6d1080c0 100644 (file)
@@ -62,16 +62,15 @@ EtherSwitch::~EtherSwitch()
     interfaces.clear();
 }
 
-EtherInt*
-EtherSwitch::getEthPort(const std::string &if_name, int idx)
+Port &
+EtherSwitch::getPort(const std::string &if_name, PortID idx)
 {
-    if (idx < 0 || idx >= interfaces.size())
-        return nullptr;
-
-    Interface *interface = interfaces.at(idx);
-    panic_if(interface->getPeer(), "interface already connected\n");
+    if (if_name == "interface") {
+        panic_if(idx < 0 || idx >= interfaces.size(), "index out of bounds");
+        return *interfaces.at(idx);
+    }
 
-    return interface;
+    return SimObject::getPort(if_name, idx);
 }
 
 bool
index 36a0c686ade9e27289a4c46b92ad4cf1ee2b1ef0..9b60b8507485ed4f21f013ca1cc5fc2b11a7780c 100644 (file)
 #include "base/inet.hh"
 #include "dev/net/etherint.hh"
 #include "dev/net/etherlink.hh"
-#include "dev/net/etherobject.hh"
 #include "dev/net/etherpkt.hh"
 #include "dev/net/pktfifo.hh"
 #include "params/EtherSwitch.hh"
 #include "sim/eventq.hh"
 #include "sim/sim_object.hh"
 
-class EtherSwitch : public SimObject, public EtherObject
+class EtherSwitch : public SimObject
 {
   public:
     typedef EtherSwitchParams Params;
@@ -62,7 +61,8 @@ class EtherSwitch : public SimObject, public EtherObject
         return dynamic_cast<const Params*>(_params);
     }
 
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
   protected:
     /**
index bf2dc68857d5132fe5d4e9d98e7e4bb710a31935..552296d5c89aebb1c7377e9e6c916d4b23ae43f3 100644 (file)
@@ -159,15 +159,12 @@ EtherTapBase::stopPolling()
 }
 
 
-EtherInt*
-EtherTapBase::getEthPort(const std::string &if_name, int idx)
+Port &
+EtherTapBase::getPort(const std::string &if_name, PortID idx)
 {
-    if (if_name == "tap") {
-        if (interface->getPeer())
-            panic("Interface already connected to\n");
-        return interface;
-    }
-    return NULL;
+    if (if_name == "tap")
+        return *interface;
+    return SimObject::getPort(if_name, idx);
 }
 
 bool
index 7db73c5b4bd52e950b4ef1f59ac09d1b5d97043f..5f59a390cda3d64a823134729defc0366c9dec7f 100644 (file)
@@ -41,7 +41,6 @@
 #include "base/pollevent.hh"
 #include "config/use_tuntap.hh"
 #include "dev/net/etherint.hh"
-#include "dev/net/etherobject.hh"
 #include "dev/net/etherpkt.hh"
 
 #if USE_TUNTAP
@@ -56,7 +55,7 @@
 class TapEvent;
 class EtherTapInt;
 
-class EtherTapBase : public SimObject, public EtherObject
+class EtherTapBase : public SimObject
 {
   public:
     typedef EtherTapBaseParams Params;
@@ -101,7 +100,8 @@ class EtherTapBase : public SimObject, public EtherObject
     EtherTapInt *interface;
 
   public:
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     bool recvSimulated(EthPacketPtr packet);
     void sendSimulated(void *data, size_t len);
index 2d55603f167ebb80e61b40359328ba506b66ce48..9d83519dfd64430299c8483ff4e83ee7da7f56e6 100644 (file)
@@ -139,16 +139,12 @@ IGbE::init()
     PciDevice::init();
 }
 
-EtherInt*
-IGbE::getEthPort(const std::string &if_name, int idx)
+Port &
+IGbE::getPort(const std::string &if_name, PortID idx)
 {
-
-    if (if_name == "interface") {
-        if (etherInt->getPeer())
-            panic("Port already connected to\n");
-        return etherInt;
-    }
-    return NULL;
+    if (if_name == "interface")
+        return *etherInt;
+    return EtherDevice::getPort(if_name, idx);
 }
 
 Tick
index 402e61d953031bc8b11f4fc4b1615873c0f4bcb5..031cb4d917a2e919cc4a221f3f2fb195f7bc132b 100644 (file)
@@ -519,7 +519,8 @@ class IGbE : public EtherDevice
     ~IGbE();
     void init() override;
 
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     Tick lastInterrupt;
 
index 1a5adb2754c8ba2fbbf3441484561c9bd8b155ba..29e88671713bf1e55af63a2138c5763f07f72418 100644 (file)
@@ -173,15 +173,12 @@ NSGigE::writeConfig(PacketPtr pkt)
     return configDelay;
 }
 
-EtherInt*
-NSGigE::getEthPort(const std::string &if_name, int idx)
+Port &
+NSGigE::getPort(const std::string &if_name, PortID idx)
 {
-    if (if_name == "interface") {
-       if (interface->getPeer())
-           panic("interface already connected to\n");
-       return interface;
-    }
-    return NULL;
+    if (if_name == "interface")
+       return *interface;
+    return EtherDevBase::getPort(if_name, idx);
 }
 
 /**
index f9be02890d11e930d80b34927fd51715abbc1ac0..5745c30408f99b4e47868e0c7d7f1512ed776df2 100644 (file)
@@ -341,7 +341,8 @@ class NSGigE : public EtherDevBase
     NSGigE(Params *params);
     ~NSGigE();
 
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     Tick writeConfig(PacketPtr pkt) override;
 
diff --git a/src/dev/net/python.cc b/src/dev/net/python.cc
deleted file mode 100644 (file)
index a012074..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2019 Google, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Gabe Black
- */
-
-#include "python/pybind11/pybind.hh"
-
-#include "dev/net/etherobject.hh"
-#include "sim/init.hh"
-
-namespace
-{
-
-void
-ethernet_pybind(pybind11::module &m_internal)
-{
-    pybind11::module m = m_internal.def_submodule("ethernet");
-    pybind11::class_<
-        EtherObject, std::unique_ptr<EtherObject, pybind11::nodelete>>(
-                m, "EtherObject");
-}
-EmbeddedPyBind embed_("ethernet", &ethernet_pybind);
-
-} // anonymous namespace
index ce9fbb6a379d1393806dd66e9b4670eeede3a1b7..8d73d15420020021d015c50f0bda6956f3c7179e 100644 (file)
@@ -142,16 +142,12 @@ Device::resetStats()
     _maxVnicDistance = 0;
 }
 
-EtherInt*
-Device::getEthPort(const std::string &if_name, int idx)
+Port &
+Device::getPort(const std::string &if_name, PortID idx)
 {
-    if (if_name == "interface") {
-        if (interface->getPeer())
-            panic("interface already connected to\n");
-
-        return interface;
-    }
-    return NULL;
+    if (if_name == "interface")
+        return *interface;
+    return EtherDevBase::getPort(if_name, idx);
 }
 
 
index 70d22f12d8b61e8084357188d89a20da49942a2d..ab79a5f6fa12c4075804105ee8fa9d1c09dd6d63 100644 (file)
@@ -230,7 +230,8 @@ class Device : public Base
   public:
     bool recvPacket(EthPacketPtr packet);
     void transferDone();
-    EtherInt *getEthPort(const std::string &if_name, int idx) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
 /**
  * DMA parameters
index 7f8959aca0806f8932f09615d64f58f66a54bac1..2a74c5c0c569cbb6f31bb031ac4493efb7ff81e8 100644 (file)
@@ -113,24 +113,24 @@ CopyEngine::CopyEngineChannel::~CopyEngineChannel()
     delete [] copyBuffer;
 }
 
-BaseMasterPort &
-CopyEngine::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+CopyEngine::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name != "dma") {
         // pass it along to our super class
-        return PciDevice::getMasterPort(if_name, idx);
+        return PciDevice::getPort(if_name, idx);
     } else {
         if (idx >= static_cast<int>(chan.size())) {
-            panic("CopyEngine::getMasterPort: unknown index %d\n", idx);
+            panic("CopyEngine::getPort: unknown index %d\n", idx);
         }
 
-        return chan[idx]->getMasterPort();
+        return chan[idx]->getPort();
     }
 }
 
 
-BaseMasterPort &
-CopyEngine::CopyEngineChannel::getMasterPort()
+Port &
+CopyEngine::CopyEngineChannel::getPort()
 {
     return cePort;
 }
index 1ec29f02e8defd8e37b4c38ecaecdc2e33182fce..eb62fd3b7f166a19fbeb630b7f6e0b8126d70ad8 100644 (file)
@@ -95,7 +95,7 @@ class CopyEngine : public PciDevice
       public:
         CopyEngineChannel(CopyEngine *_ce, int cid);
         virtual ~CopyEngineChannel();
-        BaseMasterPort &getMasterPort();
+        Port &getPort();
 
         std::string name() { assert(ce); return ce->name() + csprintf("-chan%d", channelId); }
         virtual Tick read(PacketPtr pkt)
@@ -193,8 +193,8 @@ class CopyEngine : public PciDevice
 
     void regStats() override;
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+            PortID idx = InvalidPortID) override;
 
     Tick read(PacketPtr pkt) override;
     Tick write(PacketPtr pkt) override;
index 2b09f14a59334f583558939b5e22487c2a9f1be3..fccc98469718e6179763d4eb08f9c6da12ea4a88 100644 (file)
@@ -70,12 +70,12 @@ X86ISA::I82094AA::init()
     IntDevice::init();
 }
 
-BaseMasterPort &
-X86ISA::I82094AA::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+X86ISA::I82094AA::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "int_master")
         return intMasterPort;
-    return BasicPioDevice::getMasterPort(if_name, idx);
+    return BasicPioDevice::getPort(if_name, idx);
 }
 
 AddrRangeList
index c9e2f1c8110c53e91898af7b281695cd5b6f1835..d5cb42f79a3ff3716d92ec2b4768eab3566111c4 100644 (file)
@@ -102,8 +102,8 @@ class I82094AA : public BasicPioDevice, public IntDevice
     void writeReg(uint8_t offset, uint32_t value);
     uint32_t readReg(uint8_t offset);
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     Tick recvResponse(PacketPtr pkt) override;
 
index c15e7e0f3988fc4c1844b7ce44bc791dd817c358..cfe25d7d8ae0ceba37ad68803f88ff9071957c55 100644 (file)
@@ -691,8 +691,8 @@ class ComputeUnit : public MemObject
     // port to the SQC TLB (there's a separate TLB for each I-cache)
     ITLBPort *sqcTLBPort;
 
-    virtual BaseMasterPort&
-    getMasterPort(const std::string &if_name, PortID idx)
+    Port &
+    getPort(const std::string &if_name, PortID idx) override
     {
         if (if_name == "memory_port") {
             memPort[idx] = new DataPort(csprintf("%s-port%d", name(), idx),
index db250c28bf174a449a955704b0abe14a34c3c89e..211e399d2afd8def5eb0133f556c2b9d3d70bafd 100644 (file)
@@ -251,14 +251,14 @@ GpuDispatcher::write(PacketPtr pkt)
 }
 
 
-BaseMasterPort&
-GpuDispatcher::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+GpuDispatcher::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "translation_port") {
         return *tlbPort;
     }
 
-    return DmaDevice::getMasterPort(if_name, idx);
+    return DmaDevice::getPort(if_name, idx);
 }
 
 void
index 92956e2d5664748174b0eee80e59fcaa98f1a84c..17dc5a5cccb5f70a886a5c24936d6f3749346a03 100644 (file)
@@ -140,8 +140,8 @@ class GpuDispatcher : public DmaDevice
 
         TLBPort *tlbPort;
 
-        virtual BaseMasterPort& getMasterPort(const std::string &if_name,
-                                              PortID idx);
+        Port &getPort(const std::string &if_name,
+                      PortID idx=InvalidPortID) override;
 
         AddrRangeList getAddrRanges() const;
         Tick read(PacketPtr pkt);
index 9e07b0547bfcc0c370d578e0b55cc0b4e53c1fcf..c23b9986f4c225cbd61af0660abcfc01c6ad6b3e 100644 (file)
@@ -137,33 +137,25 @@ namespace X86ISA
         assert(translationReturnEvent.empty());
     }
 
-    BaseSlavePort&
-    GpuTLB::getSlavePort(const std::string &if_name, PortID idx)
+    Port &
+    GpuTLB::getPort(const std::string &if_name, PortID idx)
     {
         if (if_name == "slave") {
             if (idx >= static_cast<PortID>(cpuSidePort.size())) {
-                panic("TLBCoalescer::getSlavePort: unknown index %d\n", idx);
+                panic("TLBCoalescer::getPort: unknown index %d\n", idx);
             }
 
             return *cpuSidePort[idx];
-        } else {
-            panic("TLBCoalescer::getSlavePort: unknown port %s\n", if_name);
-        }
-    }
-
-    BaseMasterPort&
-    GpuTLB::getMasterPort(const std::string &if_name, PortID idx)
-    {
-        if (if_name == "master") {
+        } else if (if_name == "master") {
             if (idx >= static_cast<PortID>(memSidePort.size())) {
-                panic("TLBCoalescer::getMasterPort: unknown index %d\n", idx);
+                panic("TLBCoalescer::getPort: unknown index %d\n", idx);
             }
 
             hasMemSidePort = true;
 
             return *memSidePort[idx];
         } else {
-            panic("TLBCoalescer::getMasterPort: unknown port %s\n", if_name);
+            panic("TLBCoalescer::getPort: unknown port %s\n", if_name);
         }
     }
 
index 9ca478d916d3084610ea80a70b2043fd39815b06..80510d7a0a0941bb851f4bd4c8fa4b34b457097c 100644 (file)
@@ -308,11 +308,8 @@ namespace X86ISA
         // TLB ports on the memory side
         std::vector<MemSidePort*> memSidePort;
 
-        BaseMasterPort &getMasterPort(const std::string &if_name,
-                                      PortID idx=InvalidPortID);
-
-        BaseSlavePort &getSlavePort(const std::string &if_name,
-                                    PortID idx=InvalidPortID);
+        Port &getPort(const std::string &if_name,
+                      PortID idx=InvalidPortID) override;
 
         /**
          * TLB TranslationState: this currently is a somewhat bastardization of
index ccf758b47379391995e6d97a913f6c3318f9c9d4..05bc11ed669febb7cab67b66076d199dd17e9cdd 100644 (file)
@@ -436,8 +436,8 @@ class LdsState: public MemObject
         return range;
     }
 
-    virtual BaseSlavePort &
-    getSlavePort(const std::string& if_name, PortID idx)
+    Port &
+    getPort(const std::string &if_name, PortID idx)
     {
         if (if_name == "cuPort") {
             // TODO need to set name dynamically at this point?
index 193c44ed8704d8be824af67e8c0aed99685fca2f..3b7631a74c3e11910945943d4911744f003e270d 100644 (file)
@@ -67,31 +67,23 @@ TLBCoalescer::TLBCoalescer(const Params *p)
     }
 }
 
-BaseSlavePort&
-TLBCoalescer::getSlavePort(const std::string &if_name, PortID idx)
+Port &
+TLBCoalescer::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "slave") {
         if (idx >= static_cast<PortID>(cpuSidePort.size())) {
-            panic("TLBCoalescer::getSlavePort: unknown index %d\n", idx);
+            panic("TLBCoalescer::getPort: unknown index %d\n", idx);
         }
 
         return *cpuSidePort[idx];
-    } else {
-        panic("TLBCoalescer::getSlavePort: unknown port %s\n", if_name);
-    }
-}
-
-BaseMasterPort&
-TLBCoalescer::getMasterPort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "master") {
+    } else  if (if_name == "master") {
         if (idx >= static_cast<PortID>(memSidePort.size())) {
-            panic("TLBCoalescer::getMasterPort: unknown index %d\n", idx);
+            panic("TLBCoalescer::getPort: unknown index %d\n", idx);
         }
 
         return *memSidePort[idx];
     } else {
-        panic("TLBCoalescer::getMasterPort: unknown port %s\n", if_name);
+        panic("TLBCoalescer::getPort: unknown port %s\n", if_name);
     }
 }
 
index 0294e4ff4385c645c4f8193c680aff4fb5f3575b..2aff81027a44434d6a563d8e74e94c9fb5f507b7 100644 (file)
@@ -211,8 +211,8 @@ class TLBCoalescer : public MemObject
     // Coalescer master ports on the memory side
     std::vector<MemSidePort*> memSidePort;
 
-    BaseMasterPort& getMasterPort(const std::string &if_name, PortID idx);
-    BaseSlavePort& getSlavePort(const std::string &if_name, PortID idx);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     void processProbeTLBEvent();
     /// This event issues the TLB probes
index 1ddb5155e74529e160916a087347fd490ac1fcd2..880dc39ad8ede6d6220412e5226758233cba4b22 100644 (file)
@@ -51,30 +51,20 @@ SimpleCache::SimpleCache(SimpleCacheParams *params) :
     }
 }
 
-BaseMasterPort&
-SimpleCache::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+SimpleCache::getPort(const std::string &if_name, PortID idx)
 {
     panic_if(idx != InvalidPortID, "This object doesn't support vector ports");
 
     // This is the name from the Python SimObject declaration in SimpleCache.py
     if (if_name == "mem_side") {
         return memPort;
-    } else {
-        // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-SimpleCache::getSlavePort(const std::string& if_name, PortID idx)
-{
-    // This is the name from the Python SimObject declaration (SimpleMemobj.py)
-    if (if_name == "cpu_side" && idx < cpuPorts.size()) {
+    } else if (if_name == "cpu_side" && idx < cpuPorts.size()) {
         // We should have already created all of the ports in the constructor
         return cpuPorts[idx];
     } else {
         // pass it along to our super class
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index 7d53ffed0984613a021c9f5e2a6915230bf2e163..56859eb77747a39f190d6fa5592b4adbc3b52509 100644 (file)
@@ -304,30 +304,17 @@ class SimpleCache : public MemObject
     SimpleCache(SimpleCacheParams *params);
 
     /**
-     * Get a master port with a given name and index. This is used at
+     * Get a port with a given name and index. This is used at
      * binding time and returns a reference to a protocol-agnostic
-     * base master port.
+     * port.
      *
      * @param if_name Port name
      * @param idx Index in the case of a VectorPort
      *
      * @return A reference to the given port
      */
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID) override;
-
-    /**
-     * Get a slave port with a given name and index. This is used at
-     * binding time and returns a reference to a protocol-agnostic
-     * base master port.
-     *
-     * @param if_name Port name
-     * @param idx Index in the case of a VectorPort
-     *
-     * @return A reference to the given port
-     */
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /**
      * Register the stats
index cb4d3d8db9f0a14f9c6891332c8787d4e779981e..c9af3461f72e0910d450a1c37823d936a62959d3 100644 (file)
@@ -41,33 +41,21 @@ SimpleMemobj::SimpleMemobj(SimpleMemobjParams *params) :
 {
 }
 
-BaseMasterPort&
-SimpleMemobj::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+SimpleMemobj::getPort(const std::string &if_name, PortID idx)
 {
     panic_if(idx != InvalidPortID, "This object doesn't support vector ports");
 
     // This is the name from the Python SimObject declaration (SimpleMemobj.py)
     if (if_name == "mem_side") {
         return memPort;
-    } else {
-        // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-SimpleMemobj::getSlavePort(const std::string& if_name, PortID idx)
-{
-    panic_if(idx != InvalidPortID, "This object doesn't support vector ports");
-
-    // This is the name from the Python SimObject declaration in SimpleCache.py
-    if (if_name == "inst_port") {
+    } else if (if_name == "inst_port") {
         return instPort;
     } else if (if_name == "data_port") {
         return dataPort;
     } else {
         // pass it along to our super class
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index a44d4336cdd852d341346d823b248c680cb1a541..7a9b44764cb2dc63ac0a89f95dfd6fd111083fb3 100644 (file)
@@ -235,30 +235,17 @@ class SimpleMemobj : public MemObject
     SimpleMemobj(SimpleMemobjParams *params);
 
     /**
-     * Get a master port with a given name and index. This is used at
+     * Get a port with a given name and index. This is used at
      * binding time and returns a reference to a protocol-agnostic
-     * base master port.
+     * port.
      *
      * @param if_name Port name
      * @param idx Index in the case of a VectorPort
      *
      * @return A reference to the given port
      */
-    BaseMasterPort& getMasterPort(const std::string& if_name,
-                                  PortID idx = InvalidPortID) override;
-
-    /**
-     * Get a slave port with a given name and index. This is used at
-     * binding time and returns a reference to a protocol-agnostic
-     * base master port.
-     *
-     * @param if_name Port name
-     * @param idx Index in the case of a VectorPort
-     *
-     * @return A reference to the given port
-     */
-    BaseSlavePort& getSlavePort(const std::string& if_name,
-                                PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 };
 
 
index 546dd69060c993e49cfe31584dd3dab2738ce957..958a8ad4cf839ed439686ad17914001456fd362a 100644 (file)
@@ -53,23 +53,15 @@ AddrMapper::init()
         fatal("Address mapper is not connected on both sides.\n");
 }
 
-BaseMasterPort&
-AddrMapper::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+AddrMapper::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master") {
         return masterPort;
-    } else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-AddrMapper::getSlavePort(const std::string& if_name, PortID idx)
-{
-    if (if_name == "slave") {
+    } else if (if_name == "slave") {
         return slavePort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index 6765638e97883e826e482352dba763078a2feaf4..6b47cfcb8e35239131b5b66dcb86a5e94ba04111 100644 (file)
@@ -62,11 +62,8 @@ class AddrMapper : public MemObject
 
     virtual ~AddrMapper() { }
 
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID);
-
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void init();
 
index 1066f47a01073028e37ee34983784a0391765abb..7428e7f779954b2ccf557e64dfaa0fac9b863ed5 100644 (file)
@@ -85,24 +85,16 @@ Bridge::Bridge(Params *p)
 {
 }
 
-BaseMasterPort&
-Bridge::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+Bridge::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master")
         return masterPort;
-    else
-        // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
-}
-
-BaseSlavePort&
-Bridge::getSlavePort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "slave")
+    else if (if_name == "slave")
         return slavePort;
     else
         // pass it along to our super class
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
index bb772771725da02c38f934d2e491827561ad09b2..90664035549485cec5d889d6531755c1f6ff7886 100644 (file)
@@ -316,10 +316,8 @@ class Bridge : public MemObject
 
   public:
 
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID);
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void init();
 
index 50622d776bf4b5dfddf86915e768fcd972167577..19655a57e9662f0f1c6bfcd7273ba042e23578f4 100644 (file)
@@ -185,23 +185,15 @@ BaseCache::init()
     forwardSnoops = cpuSidePort.isSnooping();
 }
 
-BaseMasterPort &
-BaseCache::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+BaseCache::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "mem_side") {
         return memSidePort;
-    }  else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort &
-BaseCache::getSlavePort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "cpu_side") {
+    } else if (if_name == "cpu_side") {
         return cpuSidePort;
-    } else {
-        return MemObject::getSlavePort(if_name, idx);
+    }  else {
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index a7b25ff2f0eb9354f1e274f6f491411fc0a9a557..a45dcba6faa9442b98f531df9670ec1a1e5b3b5e 100644 (file)
@@ -1028,10 +1028,8 @@ class BaseCache : public MemObject
 
     void init() override;
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
-    BaseSlavePort &getSlavePort(const std::string &if_name,
-                                PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /**
      * Query block size of a cache.
index 223d1cc9f6738c1c4129fa7bbbc7baddb65ea9e5..f27027dfd18168db1614abcf83bf5a57137060f3 100644 (file)
@@ -83,23 +83,15 @@ CommMonitor::regProbePoints()
     ppPktResp.reset(new ProbePoints::Packet(getProbeManager(), "PktResponse"));
 }
 
-BaseMasterPort&
-CommMonitor::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+CommMonitor::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master") {
         return masterPort;
-    } else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-CommMonitor::getSlavePort(const std::string& if_name, PortID idx)
-{
-    if (if_name == "slave") {
+    } else if (if_name == "slave") {
         return slavePort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index dac71185c7879d805ecf37f31e07d2e04cbdd392..1eea6a535fc1765939989debe0676b43a973faa1 100644 (file)
@@ -84,11 +84,8 @@ class CommMonitor : public MemObject
     void regProbePoints() override;
 
   public: // MemObject interfaces
-    BaseMasterPort& getMasterPort(const std::string& if_name,
-                                  PortID idx = InvalidPortID) override;
-
-    BaseSlavePort& getSlavePort(const std::string& if_name,
-                                PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
   private:
 
index b6ec4653ddf451c97008a94a4b7f8d59c14e20e4..dd03cf1133ec90adf1fa2cee6a5e0a197ee60f6d 100644 (file)
@@ -2845,11 +2845,11 @@ DRAMCtrl::recvFunctional(PacketPtr pkt)
     functionalAccess(pkt);
 }
 
-BaseSlavePort&
-DRAMCtrl::getSlavePort(const string &if_name, PortID idx)
+Port &
+DRAMCtrl::getPort(const string &if_name, PortID idx)
 {
     if (if_name != "port") {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     } else {
         return port;
     }
index a5f2fbe3ea73c158ef3755af9c0af2f3e1ef963e..d09223b4b7d58d371d891853fb4bec44ff83a956 100644 (file)
@@ -1176,8 +1176,8 @@ class DRAMCtrl : public QoS::MemCtrl
 
     DrainState drain() override;
 
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void init() override;
     virtual void startup() override;
index 6fe8543644c8c34dccfc4f0fb254a5a95762b746..f0c61212065883c3298badf9f8fa7c217cc955ca 100644 (file)
@@ -336,11 +336,11 @@ void DRAMSim2::writeComplete(unsigned id, uint64_t addr, uint64_t cycle)
         signalDrainDone();
 }
 
-BaseSlavePort&
-DRAMSim2::getSlavePort(const std::string &if_name, PortID idx)
+Port &
+DRAMSim2::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name != "port") {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     } else {
         return port;
     }
index 6444f75d646a7b30d596f9e1ec5808cf229495f3..2fd140bb43cbfed4e5529da174bc009327a1eee5 100644 (file)
@@ -191,8 +191,8 @@ class DRAMSim2 : public AbstractMemory
 
     DrainState drain() override;
 
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     void init() override;
     void startup() override;
index 373aa84fe7c9978085b33cdf00542308eaf3cf83..799f850366feb4a5bdf2b6fb131588e7ad8d62cc 100644 (file)
@@ -60,9 +60,8 @@ ExternalMaster::ExternalMaster(ExternalMasterParams *params) :
     masterId(params->system->getMasterId(this))
 {}
 
-BaseMasterPort &
-ExternalMaster::getMasterPort(const std::string &if_name,
-    PortID idx)
+Port &
+ExternalMaster::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port") {
         DPRINTF(ExternalPort, "Trying to bind external port: %s %s\n",
@@ -84,7 +83,7 @@ ExternalMaster::getMasterPort(const std::string &if_name,
         }
         return *externalPort;
     } else {
-        return MemObject::getMasterPort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index d27cb4df1e1c702c08cfc9f30b792c7756b7022e..42ac67c03b484502f3fc8e5545cb82cf69a55a47 100644 (file)
@@ -67,18 +67,18 @@ class ExternalMaster : public MemObject
 {
   public:
     /** Derive from this class to create an external port interface */
-    class Port : public MasterPort
+    class ExternalPort : public MasterPort
     {
       protected:
         ExternalMaster &owner;
 
       public:
-        Port(const std::string &name_,
+        ExternalPort(const std::string &name_,
             ExternalMaster &owner_) :
             MasterPort(name_, &owner_), owner(owner_)
         { }
 
-        ~Port() { }
+        ~ExternalPort() { }
 
         /** Any or all of recv... can be overloaded to provide the port's
          *  functionality */
@@ -93,14 +93,14 @@ class ExternalMaster : public MemObject
       public:
         /** Create or find an external port which can be bound.  Returns
          *  NULL on failure */
-        virtual Port *getExternalPort(
+        virtual ExternalPort *getExternalPort(
             const std::string &name, ExternalMaster &owner,
             const std::string &port_data) = 0;
     };
 
   protected:
     /** The peer port for the gem5 port "port" */
-    Port *externalPort;
+    ExternalPort *externalPort;
 
     /** Name of the bound port.  This will be name() + ".port" */
     std::string portName;
@@ -120,9 +120,9 @@ class ExternalMaster : public MemObject
   public:
     ExternalMaster(ExternalMasterParams *params);
 
-    /** MasterPort interface.  Responds only to port "port" */
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-        PortID idx = InvalidPortID);
+    /** Port interface.  Responds only to port "port" */
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /** Register a handler which can provide ports with port_type ==
      *  handler_name */
index ac93e669ce461566bb3fd6b51a020aba5ee5083c..6266f6649a7336b11059bec834b0bc91397adc05 100644 (file)
@@ -49,7 +49,7 @@
  *  a message.  The stub port can be used to configure and test a system
  *  where the external port is used for a peripheral before connecting
  *  the external port */
-class StubSlavePort : public ExternalSlave::Port
+class StubSlavePort : public ExternalSlave::ExternalPort
 {
   public:
     void processResponseEvent();
@@ -66,7 +66,7 @@ class StubSlavePort : public ExternalSlave::Port
 
     StubSlavePort(const std::string &name_,
         ExternalSlave &owner_) :
-        ExternalSlave::Port(name_, owner_),
+        ExternalSlave::ExternalPort(name_, owner_),
         responseEvent([this]{ processResponseEvent(); }, name()),
         responsePacket(NULL), mustRetry(false)
     { }
@@ -83,7 +83,7 @@ class StubSlavePortHandler : public
     ExternalSlave::Handler
 {
   public:
-    ExternalSlave::Port *getExternalPort(
+    ExternalSlave::ExternalPort *getExternalPort(
         const std::string &name_,
         ExternalSlave &owner,
         const std::string &port_data)
@@ -175,7 +175,7 @@ std::map<std::string, ExternalSlave::Handler *>
     ExternalSlave::portHandlers;
 
 AddrRangeList
-ExternalSlave::Port::getAddrRanges() const
+ExternalSlave::ExternalPort::getAddrRanges() const
 {
     return owner.addrRanges;
 }
@@ -193,9 +193,8 @@ ExternalSlave::ExternalSlave(ExternalSlaveParams *params) :
         registerHandler("stub", new StubSlavePortHandler);
 }
 
-BaseSlavePort &
-ExternalSlave::getSlavePort(const std::string &if_name,
-    PortID idx)
+Port &
+ExternalSlave::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "port") {
         DPRINTF(ExternalPort, "Trying to bind external port: %s %s\n",
@@ -217,7 +216,7 @@ ExternalSlave::getSlavePort(const std::string &if_name,
         }
         return *externalPort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index 2bb0be869ecf2b7c92dba7edbb2d3838e29c57e0..7290d633970b0ff935b36a0f77dabf884546d31c 100644 (file)
@@ -67,18 +67,18 @@ class ExternalSlave : public MemObject
 {
   public:
     /** Derive from this class to create an external port interface */
-    class Port : public SlavePort
+    class ExternalPort : public SlavePort
     {
       protected:
         ExternalSlave &owner;
 
       public:
-        Port(const std::string &name_,
+        ExternalPort(const std::string &name_,
             ExternalSlave &owner_) :
             SlavePort(name_, &owner_), owner(owner_)
         { }
 
-        ~Port() { }
+        ~ExternalPort() { }
 
         /** Any or all of recv... can be overloaded to provide the port's
          *  functionality */
@@ -95,14 +95,14 @@ class ExternalSlave : public MemObject
       public:
         /** Create or find an external port which can be bound.  Returns
          *  NULL on failure */
-        virtual Port *getExternalPort(
+        virtual ExternalPort *getExternalPort(
             const std::string &name, ExternalSlave &owner,
             const std::string &port_data) = 0;
     };
 
   protected:
     /** The peer port for the gem5 port "port" */
-    Port *externalPort;
+    ExternalPort *externalPort;
 
     /** Name of the bound port.  This will be name() + ".port" */
     std::string portName;
@@ -126,9 +126,9 @@ class ExternalSlave : public MemObject
   public:
     ExternalSlave(ExternalSlaveParams *params);
 
-    /** SlavePort interface.  Responds only to port "port" */
-    BaseSlavePort &getSlavePort(const std::string &if_name,
-        PortID idx = InvalidPortID);
+    /** Port interface.  Responds only to port "port" */
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /** Register a handler which can provide ports with port_type ==
      *  handler_name */
index 75c797c32555dc212d6fdb23207e77a195bb3a7b..8364b919824a3c89da854d3a5ebd220cecab9195 100644 (file)
@@ -73,23 +73,15 @@ MemCheckerMonitor::init()
         fatal("Communication monitor is not connected on both sides.\n");
 }
 
-BaseMasterPort&
-MemCheckerMonitor::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+MemCheckerMonitor::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master" || if_name == "mem_side") {
         return masterPort;
-    } else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-MemCheckerMonitor::getSlavePort(const std::string& if_name, PortID idx)
-{
-    if (if_name == "slave" || if_name == "cpu_side") {
+    } else if (if_name == "slave" || if_name == "cpu_side") {
         return slavePort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index e3a8832b568a8896636d635a3008ba402f5ee17d..0564a81788e623d206220627b450f32417fd5b4c 100644 (file)
@@ -70,11 +70,8 @@ class MemCheckerMonitor : public MemObject
     /** Destructor */
     ~MemCheckerMonitor();
 
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID);
-
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void init();
 
index b3c89d2a3dba1e12c93285812729c960739ec93d..67a9664f87cfbf6d82ac7fdb0c87c4ef10314d14 100644 (file)
@@ -60,23 +60,15 @@ MemDelay::init()
 }
 
 
-BaseMasterPort&
-MemDelay::getMasterPort(const std::string& if_name, PortID idx)
+Port &
+MemDelay::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master") {
         return masterPort;
-    } else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort&
-MemDelay::getSlavePort(const std::string& if_name, PortID idx)
-{
-    if (if_name == "slave") {
+    } else if (if_name == "slave") {
         return slavePort;
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index 7ecb656f59205f0b1ff12cf843545285a3182872..789d965c823ee1b42b9f67aa4ca91747dbc17819 100644 (file)
@@ -69,12 +69,9 @@ class MemDelay : public MemObject
 
     void init() override;
 
-  protected: // Port interfaces
-    BaseMasterPort& getMasterPort(const std::string &if_name,
-                                          PortID idx = InvalidPortID) override;
-
-    BaseSlavePort& getSlavePort(const std::string &if_name,
-                                PortID idx = InvalidPortID) override;
+  protected: // Port interface
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     class MasterPort : public QueuedMasterPort
     {
index 766eceeb7faf901c1bf9ea8174721c5a48a28809..c88905d09d592936648562509038ad6854b15b61 100644 (file)
@@ -47,15 +47,3 @@ MemObject::MemObject(const Params *params)
     : ClockedObject(params)
 {
 }
-
-BaseMasterPort&
-MemObject::getMasterPort(const std::string& if_name, PortID idx)
-{
-    fatal("%s does not have any master port named %s\n", name(), if_name);
-}
-
-BaseSlavePort&
-MemObject::getSlavePort(const std::string& if_name, PortID idx)
-{
-    fatal("%s does not have any slave port named %s\n", name(), if_name);
-}
index e12b30661b455e83afcfd56478a0950352bd6dce..3ae9c4adfcf0b5b654ff17b476fe35d15bfee5fc 100644 (file)
@@ -54,8 +54,7 @@
 #include "sim/clocked_object.hh"
 
 /**
- * The MemObject class extends the ClockedObject with accessor functions
- * to get its master and slave ports.
+ * The MemObject class extends the ClockedObject for historical reasons.
  */
 class MemObject : public ClockedObject
 {
@@ -65,32 +64,6 @@ class MemObject : public ClockedObject
     { return dynamic_cast<const Params *>(_params); }
 
     MemObject(const Params *params);
-
-    /**
-     * Get a master port with a given name and index. This is used at
-     * binding time and returns a reference to a protocol-agnostic
-     * base master port.
-     *
-     * @param if_name Port name
-     * @param idx Index in the case of a VectorPort
-     *
-     * @return A reference to the given port
-     */
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID);
-
-    /**
-     * Get a slave port with a given name and index. This is used at
-     * binding time and returns a reference to a protocol-agnostic
-     * base master port.
-     *
-     * @param if_name Port name
-     * @param idx Index in the case of a VectorPort
-     *
-     * @return A reference to the given port
-     */
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID);
 };
 
 #endif //__MEM_MEM_OBJECT_HH__
index 77cfbaf22a88b3de0528e11e6acfb3da6fa75c98..3ff2339d5009e22991ff0600228cb4e9c60c1681 100644 (file)
@@ -106,11 +106,11 @@ MemSinkCtrl::recvFunctional(PacketPtr pkt)
     pkt->popLabel();
 }
 
-BaseSlavePort &
-MemSinkCtrl::getSlavePort(const std::string &interface, PortID idx)
+Port &
+MemSinkCtrl::getPort(const std::string &interface, PortID idx)
 {
     if (interface != "port") {
-        return MemObject::getSlavePort(interface, idx);
+        return MemObject::getPort(interface, idx);
     } else {
         return port;
     }
index 84258e0acfdb290698faac2fabff96fac535d30e..9a51269dc807139ea49f5e5c4a2056d3b6caf749 100644 (file)
@@ -133,12 +133,11 @@ class MemSinkCtrl : public MemCtrl
     /**
      * Getter method to access this memory's slave port
      *
-     * @param interface interface name
+     * @param if_name interface name
      * @param idx port ID number
      * @return reference to this memory's slave port
      */
-    BaseSlavePort& getSlavePort(const std::string&,
-            PortID = InvalidPortID) override;
+    Port &getPort(const std::string &if_name, PortID=InvalidPortID) override;
 
     /**
      * Initializes this object
index 69a0fb33e20db87f278218399d5485169a4bfd4d..4e85ac4132d03a9ac8f3e1bb4babb44e766d2061 100644 (file)
 
 #include "base/trace.hh"
 #include "debug/RubyQueue.hh"
+#include "mem/packet.hh"
+#include "mem/port.hh"
 #include "mem/ruby/common/Address.hh"
 #include "mem/ruby/common/Consumer.hh"
+#include "mem/ruby/network/dummy_port.hh"
 #include "mem/ruby/slicc_interface/Message.hh"
-#include "mem/packet.hh"
 #include "params/MessageBuffer.hh"
 #include "sim/sim_object.hh"
 
@@ -120,6 +122,12 @@ class MessageBuffer : public SimObject
     void setIncomingLink(int link_id) { m_input_link_id = link_id; }
     void setVnet(int net) { m_vnet_id = net; }
 
+    Port &
+    getPort(const std::string &, PortID idx=InvalidPortID) override
+    {
+        return RubyDummyPort::instance();
+    }
+
     void regStats();
 
     // Function for figuring out if any of the messages in the buffer need
index 7f5ed2aaea4a74a94ce8c14f8ba0c4cb1a9726a1..4e9791824a619060070086019d23940eda83fcc6 100644 (file)
 #include "base/addr_range.hh"
 #include "base/types.hh"
 #include "mem/packet.hh"
+#include "mem/port.hh"
 #include "mem/protocol/LinkDirection.hh"
 #include "mem/protocol/MessageSizeType.hh"
 #include "mem/ruby/common/MachineID.hh"
 #include "mem/ruby/common/TypeDefines.hh"
 #include "mem/ruby/network/Topology.hh"
+#include "mem/ruby/network/dummy_port.hh"
 #include "params/RubyNetwork.hh"
 #include "sim/clocked_object.hh"
 
@@ -132,6 +134,12 @@ class Network : public ClockedObject
      */
     NodeID addressToNodeID(Addr addr, MachineType mtype);
 
+    Port &
+    getPort(const std::string &, PortID idx=InvalidPortID) override
+    {
+        return RubyDummyPort::instance();
+    }
+
   protected:
     // Private copy constructor and assignment operator
     Network(const Network& obj);
diff --git a/src/mem/ruby/network/dummy_port.hh b/src/mem/ruby/network/dummy_port.hh
new file mode 100644 (file)
index 0000000..ca1ef41
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2019 Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#ifndef __MEM_RUBY_NETWORK_DUMMY_PORT_HH__
+#define __MEM_RUBY_NETWORK_DUMMY_PORT_HH__
+
+#include "mem/port.hh"
+
+class RubyDummyPort : public Port
+{
+  public:
+    RubyDummyPort() : Port("DummyPort", -1) {}
+
+    void
+    bind(Port &peer) override
+    {
+        // No need to connect anything here currently. MessageBuffer
+        // port connections only serve to print the connections in
+        // the config output.
+        // TODO: Add real ports to MessageBuffers and use MemObject connect
+        // code below to bind MessageBuffer senders and receivers
+    }
+    void unbind() override {}
+
+    static RubyDummyPort &
+    instance()
+    {
+        static RubyDummyPort dummy;
+        return dummy;
+    }
+};
+
+#endif //__MEM_RUBY_NETWORK_DUMMY_PORT_HH__
index 1327eccfb0b17f0aebf821f14a846e456cbecf44..fa1c936b7052a21a7b7a1bfe17c2f201a2368a67 100644 (file)
@@ -229,9 +229,8 @@ AbstractController::isBlocked(Addr addr)
     return (m_block_map.count(addr) > 0);
 }
 
-BaseMasterPort &
-AbstractController::getMasterPort(const std::string &if_name,
-                                  PortID idx)
+Port &
+AbstractController::getPort(const std::string &if_name, PortID idx)
 {
     return memoryPort;
 }
index 35cd3d2a55b75134a7f304f1f29b9f52e67fba65..5e39a28d2344827794fb80394420c7f5332ef8ee 100644 (file)
@@ -126,8 +126,8 @@ class AbstractController : public MemObject, public Consumer
     virtual void initNetQueues() = 0;
 
     /** A function used to return the port associated with this bus object. */
-    BaseMasterPort& getMasterPort(const std::string& if_name,
-                                  PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID);
 
     void queueMemoryRead(const MachineID &id, Addr addr, Cycles latency);
     void queueMemoryWrite(const MachineID &id, Addr addr, Cycles latency,
index 84a70c0f1eb14762e93b529a1798d334a402e24d..795b473c767ddb336d44546fb59eded34c82ec76 100644 (file)
@@ -87,53 +87,37 @@ RubyPort::init()
     m_mandatory_q_ptr = m_controller->getMandatoryQueue();
 }
 
-BaseMasterPort &
-RubyPort::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+RubyPort::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "mem_master_port") {
         return memMasterPort;
-    }
-
-    if (if_name == "pio_master_port") {
+    } else if (if_name == "pio_master_port") {
         return pioMasterPort;
-    }
-
-    // used by the x86 CPUs to connect the interrupt PIO and interrupt slave
-    // port
-    if (if_name != "master") {
-        // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
-    } else {
+    } else if (if_name == "mem_slave_port") {
+        return memSlavePort;
+    } else if (if_name == "pio_slave_port") {
+        return pioSlavePort;
+    } else if (if_name == "master") {
+        // used by the x86 CPUs to connect the interrupt PIO and interrupt
+        // slave port
         if (idx >= static_cast<PortID>(master_ports.size())) {
-            panic("RubyPort::getMasterPort: unknown index %d\n", idx);
+            panic("RubyPort::getPort master: unknown index %d\n", idx);
         }
 
         return *master_ports[idx];
-    }
-}
-
-BaseSlavePort &
-RubyPort::getSlavePort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "mem_slave_port") {
-        return memSlavePort;
-    }
-
-    if (if_name == "pio_slave_port")
-        return pioSlavePort;
-
-    // used by the CPUs to connect the caches to the interconnect, and
-    // for the x86 case also the interrupt master
-    if (if_name != "slave") {
-        // pass it along to our super class
-        return MemObject::getSlavePort(if_name, idx);
-    } else {
+    } else if (if_name == "slave") {
+        // used by the CPUs to connect the caches to the interconnect, and
+        // for the x86 case also the interrupt master
         if (idx >= static_cast<PortID>(slave_ports.size())) {
-            panic("RubyPort::getSlavePort: unknown index %d\n", idx);
+            panic("RubyPort::getPort slave: unknown index %d\n", idx);
         }
 
         return *slave_ports[idx];
     }
+
+    // pass it along to our super class
+    return MemObject::getPort(if_name, idx);
 }
 
 RubyPort::PioMasterPort::PioMasterPort(const std::string &_name,
index 146443282470e12deec8a09d361533ade29f7632..922b3a9738afda2d4a4677db4414bf542bb255bf 100644 (file)
@@ -148,10 +148,8 @@ class RubyPort : public MemObject
 
     void init() override;
 
-    BaseMasterPort &getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
-    BaseSlavePort &getSlavePort(const std::string &if_name,
-                                PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual RequestStatus makeRequest(PacketPtr pkt) = 0;
     virtual int outstandingCount() const = 0;
index e1f3a001a638c9c4ead55a7990505af97a0961a3..438fb0e686f220148c2312a232109add667b40a5 100644 (file)
@@ -93,24 +93,16 @@ SerialLink::SerialLink(SerialLinkParams *p)
 {
 }
 
-BaseMasterPort&
-SerialLink::getMasterPort(const std::string &if_name, PortID idx)
+Port&
+SerialLink::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master")
         return masterPort;
-    else
-        // pass it along to our super class
-        return MemObject::getMasterPort(if_name, idx);
-}
-
-BaseSlavePort&
-SerialLink::getSlavePort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "slave")
+    else if (if_name == "slave")
         return slavePort;
     else
         // pass it along to our super class
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
 }
 
 void
index 6315f1b947b0c70b67def4a27d831f19c500c241..0bb1692ed76cf389dc41f622242f1c9a520ae0cc 100644 (file)
@@ -315,10 +315,8 @@ class SerialLink : public MemObject
 
   public:
 
-    virtual BaseMasterPort& getMasterPort(const std::string& if_name,
-                                          PortID idx = InvalidPortID);
-    virtual BaseSlavePort& getSlavePort(const std::string& if_name,
-                                        PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID);
 
     virtual void init();
 
index 64d7d204c3f9438e76d7dd7ed2fd887049541dbc..32fea1e89082d9703960b0ed97d977f71562bb8f 100644 (file)
@@ -231,11 +231,11 @@ SimpleMemory::recvRespRetry()
     dequeue();
 }
 
-BaseSlavePort &
-SimpleMemory::getSlavePort(const std::string &if_name, PortID idx)
+Port &
+SimpleMemory::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name != "port") {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     } else {
         return port;
     }
index 307981b80f0fbb6c246db1731d38e2b432285b21..c8c3db516175fdf0c99a983dafb68646a98f9b45 100644 (file)
@@ -187,8 +187,8 @@ class SimpleMemory : public AbstractMemory
 
     DrainState drain() override;
 
-    BaseSlavePort& getSlavePort(const std::string& if_name,
-                                PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
     void init() override;
 
   protected:
index b139cdc9b9dabd2a5b366b7e0007438bb60d4dde..247024eff63ef83ff90739dd1235489fb1ebc743 100644 (file)
@@ -81,27 +81,19 @@ BaseXBar::init()
 {
 }
 
-BaseMasterPort &
-BaseXBar::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+BaseXBar::getPort(const std::string &if_name, PortID idx)
 {
     if (if_name == "master" && idx < masterPorts.size()) {
         // the master port index translates directly to the vector position
         return *masterPorts[idx];
     } else  if (if_name == "default") {
         return *masterPorts[defaultPortID];
-    } else {
-        return MemObject::getMasterPort(if_name, idx);
-    }
-}
-
-BaseSlavePort &
-BaseXBar::getSlavePort(const std::string &if_name, PortID idx)
-{
-    if (if_name == "slave" && idx < slavePorts.size()) {
+    } else if (if_name == "slave" && idx < slavePorts.size()) {
         // the slave port index translates directly to the vector position
         return *slavePorts[idx];
     } else {
-        return MemObject::getSlavePort(if_name, idx);
+        return MemObject::getPort(if_name, idx);
     }
 }
 
index abe2a1096315cc1724610cb82ac185658050631d..0745ea5ac8e11d89e2b73d9f5397892c14829c82 100644 (file)
@@ -413,10 +413,8 @@ class BaseXBar : public MemObject
     virtual void init();
 
     /** A function used to return the port associated with this object. */
-    BaseMasterPort& getMasterPort(const std::string& if_name,
-                                  PortID idx = InvalidPortID);
-    BaseSlavePort& getSlavePort(const std::string& if_name,
-                                PortID idx = InvalidPortID);
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     virtual void regStats();
 
index 36e0d5bfc9ddd88e9f6babba84495294194722d7..fb1666cd3c00fd727fbf72681b758929a1a83b60 100644 (file)
@@ -70,5 +70,4 @@ PySource('m5.ext.pyfdt', 'm5/ext/pyfdt/__init__.py')
 Source('pybind11/core.cc', add_tags='python')
 Source('pybind11/debug.cc', add_tags='python')
 Source('pybind11/event.cc', add_tags='python')
-Source('pybind11/pyobject.cc', add_tags='python')
 Source('pybind11/stats.cc', add_tags='python')
index 9a0643c5af27c33fe1654ed10a8a719dc69bdecc..e2e470a1818bdf64add233e2bb3225bf6330d08b 100644 (file)
@@ -46,7 +46,6 @@ void pybind_init_core(pybind11::module &m_native);
 void pybind_init_debug(pybind11::module &m_native);
 
 void pybind_init_event(pybind11::module &m_native);
-void pybind_init_pyobject(pybind11::module &m_native);
 void pybind_init_stats(pybind11::module &m_native);
 
 #endif
diff --git a/src/python/pybind11/pyobject.cc b/src/python/pybind11/pyobject.cc
deleted file mode 100644 (file)
index bd363a1..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (c) 2017 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) 2006 The Regents of The University of Michigan
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * Authors: Nathan Binkert
- */
-
-#include "pybind11/pybind11.h"
-
-#include <string>
-
-#include "config/the_isa.hh"
-
-#include "dev/net/etherdevice.hh"
-#include "dev/net/etherint.hh"
-#include "dev/net/etherobject.hh"
-#include "mem/mem_object.hh"
-#include "mem/ruby/network/Network.hh"
-#include "mem/ruby/slicc_interface/AbstractController.hh"
-#include "mem/ruby/system/Sequencer.hh"
-#include "sim/full_system.hh"
-
-namespace py = pybind11;
-
-/**
- * Connect the described MemObject ports.  Called from Python.
- * The indices i1 & i2 will be -1 for regular ports, >= 0 for vector ports.
- * SimObject1 is the master, and SimObject2 is the slave
- */
-static int
-connectPorts(SimObject *o1, const std::string &name1, int i1,
-             SimObject *o2, const std::string &name2, int i2)
-{
-    auto *eo1 = dynamic_cast<EtherObject*>(o1);
-    auto *eo2 = dynamic_cast<EtherObject*>(o2);
-
-    if (eo1 && eo2) {
-        EtherInt *p1 = eo1->getEthPort(name1, i1);
-        EtherInt *p2 = eo2->getEthPort(name2, i2);
-
-        if (p1 && p2) {
-            p1->setPeer(p2);
-            p2->setPeer(p1);
-
-            return 1;
-        }
-    }
-
-    // These could be MessageBuffers from the ruby memory system. If so, they
-    // need not be connected to anything currently.
-    MessageBuffer *mb1, *mb2;
-    mb1 = dynamic_cast<MessageBuffer*>(o1);
-    mb2 = dynamic_cast<MessageBuffer*>(o2);
-    Network *nw1, *nw2;
-    nw1 = dynamic_cast<Network*>(o1);
-    nw2 = dynamic_cast<Network*>(o2);
-
-    if ((mb1 || nw1) && (mb2 || nw2)) {
-        // No need to connect anything here currently. MessageBuffer
-        // connections in Python only serve to print the connections in
-        // the config output.
-        // TODO: Add real ports to MessageBuffers and use MemObject connect
-        // code below to bind MessageBuffer senders and receivers
-        return 1;
-    }
-
-    MemObject *mo1, *mo2;
-    mo1 = dynamic_cast<MemObject*>(o1);
-    mo2 = dynamic_cast<MemObject*>(o2);
-
-    if (mo1 == NULL || mo2 == NULL) {
-        panic ("Error casting SimObjects %s and %s to MemObject", o1->name(),
-               o2->name());
-    }
-
-    // generic master/slave port connection
-    BaseMasterPort& masterPort = mo1->getMasterPort(name1, i1);
-    BaseSlavePort& slavePort   = mo2->getSlavePort(name2, i2);
-
-    masterPort.bind(slavePort);
-
-    return 1;
-}
-
-void
-pybind_init_pyobject(py::module &m_native)
-{
-    py::module m = m_native.def_submodule("pyobject");
-
-    m.def("connectPorts", &connectPorts);
-}
index a59b0ed1a9f3ae94327363a4d7ca672e4e509545..54e251287a9630aa437349ac76c4086615ef0e6a 100644 (file)
@@ -55,6 +55,7 @@ Source('init.cc', add_tags='python')
 Source('init_signals.cc')
 Source('main.cc', tags='main')
 Source('port.cc')
+Source('python.cc', add_tags='python')
 Source('root.cc')
 Source('serialize.cc')
 Source('drain.cc')
index 91573612709b3d5f0c030993dcf1092f6e558055..35d008d58b80a5e3e2aea86d0954945e2aac21f7 100644 (file)
@@ -471,9 +471,9 @@ CxxConfigManager::bindPort(
      *  getCxxConfigDirectoryEntry for each object. */
 
     /* It would be nice to be able to catch the errors from these calls. */
-    BaseMasterPort &master_port = master_mem_object->getMasterPort(
+    Port &master_port = master_mem_object->getPort(
         master_port_name, master_port_index);
-    BaseSlavePort &slave_port = slave_mem_object->getSlavePort(
+    Port &slave_port = slave_mem_object->getPort(
         slave_port_name, slave_port_index);
 
     if (master_port.isConnected()) {
index 5a49f360abd896466770dcd4fe8e11e37c209e14..1fb7e6e1ddccb9171c5a8981831ba8723f44c271 100644 (file)
@@ -207,7 +207,6 @@ EmbeddedPyBind::initAll()
     pybind_init_debug(m_m5);
 
     pybind_init_event(m_m5);
-    pybind_init_pyobject(m_m5);
     pybind_init_stats(m_m5);
 
     for (auto &kv : getMap()) {
diff --git a/src/sim/python.cc b/src/sim/python.cc
new file mode 100644 (file)
index 0000000..159f32a
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2019 Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#include "pybind11/pybind11.h"
+#include "sim/init.hh"
+#include "sim/port.hh"
+
+namespace
+{
+
+void
+sim_pybind(pybind11::module &m_internal)
+{
+    pybind11::module m = m_internal.def_submodule("sim");
+    pybind11::class_<
+        Port, std::unique_ptr<Port, pybind11::nodelete>>(m, "Port")
+        .def("bind", &Port::bind)
+        ;
+}
+EmbeddedPyBind embed_("sim", &sim_pybind);
+
+} // anonymous namespace
index ffa8edaa639a9dab4c05d516114728ce975ba22c..2113fc07965f4260a65a5049806033181d60e08d 100644 (file)
@@ -218,8 +218,8 @@ System::init()
         panic("System port on %s is not connected.\n", name());
 }
 
-BaseMasterPort&
-System::getMasterPort(const std::string &if_name, PortID idx)
+Port &
+System::getPort(const std::string &if_name, PortID idx)
 {
     // no need to distinguish at the moment (besides checking)
     return _systemPort;
index 878c8125279d113a6097281c15aae821e8ef3fc2..69448d35fd0f45aa47ee743dbbc9cbe9a13adb2f 100644 (file)
@@ -128,8 +128,8 @@ class System : public MemObject
     /**
      * Additional function to return the Port of a memory object.
      */
-    BaseMasterPort& getMasterPort(const std::string &if_name,
-                                  PortID idx = InvalidPortID) override;
+    Port &getPort(const std::string &if_name,
+                  PortID idx=InvalidPortID) override;
 
     /** @{ */
     /**