Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/66673?usp=email )

Change subject: fastmodel,dev: Rework the Int*Pin classes with Signal*Port.
......................................................................

fastmodel,dev: Rework the Int*Pin classes with Signal*Port.

These are largely compatibility wrappers around the Signal*Port
classes. The python versions of these types enforce more specific
compatibility, but on the c++ side the Signal*Port<bool> classes can
be used directly instead.

Change-Id: I1325074d0ed1c8fc6dfece5ac1ee33872cc4f5e3
---
M src/arch/arm/fastmodel/common/signal_sender.hh
M src/dev/SConscript
D src/dev/intpin.cc
M src/dev/intpin.hh
4 files changed, 62 insertions(+), 139 deletions(-)



diff --git a/src/arch/arm/fastmodel/common/signal_sender.hh b/src/arch/arm/fastmodel/common/signal_sender.hh
index f4772cf..812a1b9 100644
--- a/src/arch/arm/fastmodel/common/signal_sender.hh
+++ b/src/arch/arm/fastmodel/common/signal_sender.hh
@@ -50,11 +50,11 @@
     SignalSender(const std::string &_name, PortID _id) :
         IntSinkPinBase(_name, _id, 0),
         signal_out((_name + ".sig").c_str())
-    {}
-
-  private:
-    void raiseOnDevice() override { signal_out.set_state(id, true); }
-    void lowerOnDevice() override { signal_out.set_state(id, false); }
+    {
+        onChange([this](const bool &new_val) {
+            signal_out.set_state(id, new_val);
+        });
+    }
 };

 } // namespace fastmodel
diff --git a/src/dev/SConscript b/src/dev/SConscript
index 6a6ce40..d991ed5 100644
--- a/src/dev/SConscript
+++ b/src/dev/SConscript
@@ -36,7 +36,6 @@
 Source('dma_virt_device.cc')

 SimObject('IntPin.py', sim_objects=[])
-Source('intpin.cc')

 SimObject('ResetPort.py', sim_objects=[])
 Source('reset_port.cc')
diff --git a/src/dev/intpin.cc b/src/dev/intpin.cc
deleted file mode 100644
index c378337..0000000
--- a/src/dev/intpin.cc
+++ /dev/null
@@ -1,67 +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.
- */
-
-#include "dev/intpin.hh"
-
-#include "base/logging.hh"
-
-namespace gem5
-{
-
-void
-IntSinkPinBase::bind(Port &peer)
-{
-    source = dynamic_cast<IntSourcePinBase *>(&peer);
-    fatal_if(!source, "Attempt to bind interrupt sink pin %s to "
-            "incompatible port %s.", name(), peer.name());
-    Port::bind(peer);
-}
-
-void
-IntSinkPinBase::unbind()
-{
-    source = nullptr;
-    Port::unbind();
-}
-
-void
-IntSourcePinBase::bind(Port &peer)
-{
-    sink = dynamic_cast<IntSinkPinBase *>(&peer);
-    fatal_if(!sink, "Attempt to bind interrupt source pin %s to "
-            "incompatible port %s.", name(), peer.name());
-    Port::bind(peer);
-}
-
-void
-IntSourcePinBase::unbind()
-{
-    sink = nullptr;
-    Port::unbind();
-}
-
-} // namespace gem5
diff --git a/src/dev/intpin.hh b/src/dev/intpin.hh
index 2704887..578dd90 100644
--- a/src/dev/intpin.hh
+++ b/src/dev/intpin.hh
@@ -28,94 +28,71 @@
 #ifndef __DEV_INTPIN_HH__
 #define __DEV_INTPIN_HH__

-#include "sim/port.hh"
+#include <type_traits>
+
+#include "sim/signal.hh"

 namespace gem5
 {

-class IntSourcePinBase;
-
-class IntSinkPinBase : public Port
+class IntSinkPinBase : public SignalSinkPort<bool>
 {
-  protected:
-    friend IntSourcePinBase;
+  private:
+    const int _number = 0;

-    IntSourcePinBase *source = nullptr;
+  public:

-    int _number = 0;
-    bool _state = false;
+    template <class Device>
+    IntSinkPinBase(const std::string &_name, PortID _id, Device *dev,
+            int num) :
+        SignalSinkPort(_name, _id), _number(num)
+    {
+        onChange([dev, num](const bool &new_val) {
+            if (new_val)
+                dev->raiseInterruptPin(num);
+            else
+                dev->lowerInterruptPin(num);
+        });
+    }
+
+    template <class Device>
+    IntSinkPinBase(const std::string &_name, PortID _id, Device *dev) :
+        IntSinkPinBase(_name, _id, dev, _id)
+    {}

     IntSinkPinBase(const std::string &_name, PortID _id, int num) :
-        Port(_name, _id), _number(num)
+        SignalSinkPort(_name, _id), _number(num)
     {}

-    virtual void raiseOnDevice() = 0;
-    virtual void lowerOnDevice() = 0;
+    IntSinkPinBase(const std::string &_name, PortID _id) :
+        IntSinkPinBase(_name, _id, _id)
+    {}

-    void
-    raise()
-    {
-        _state = true;
-        raiseOnDevice();
-    }
-
-    void
-    lower()
-    {
-        _state = false;
-        lowerOnDevice();
-    }
-
-  public:
     int number() { return _number; }
-    bool state() { return _state; }
-
-    void bind(Port &peer) override;
-    void unbind() override;
 };

-template <class Device>
-class IntSinkPin : public IntSinkPinBase
+template <class Compat>
+using IntSinkPin = IntSinkPinBase;
+
+class IntSourcePinBase : public SignalSourcePort<bool>
 {
-  private:
-    Device *device = nullptr;
-
-    void raiseOnDevice() override { device->raiseInterruptPin(number()); }
-    void lowerOnDevice() override { device->lowerInterruptPin(number()); }
-
   public:
- IntSinkPin(const std::string &_name, PortID _id, Device *dev, int num) :
-        IntSinkPinBase(_name, _id, num), device(dev) {}
-    IntSinkPin(const std::string &_name, PortID _id, Device *dev) :
-        IntSinkPin(_name, _id, dev, _id) {}
-};
-
-class IntSourcePinBase : public Port
-{
-  private:
-    IntSinkPinBase *sink = nullptr;
-
-  public:
-    IntSourcePinBase(const std::string &_name, PortID _id):
-        Port(_name, _id)
+    template <class Device>
+    IntSourcePinBase(const std::string &_name, PortID _id, Device *owner) :
+        SignalSourcePort(_name, _id)
     {}

-    void raise() { sink->raise(); }
-    void lower() { sink->lower(); }
-
-    void bind(Port &peer) override;
-    void unbind() override;
-};
-
-template <class Device>
-class IntSourcePin : public IntSourcePinBase
-{
-  public:
-    IntSourcePin(const std::string &_name, PortID _id, Device *owner) :
-        IntSourcePinBase(_name, _id)
+    IntSourcePinBase(const std::string &_name, PortID _id) :
+        SignalSourcePort(_name, _id)
     {}
+
+    void raise() { set(true); }
+    void lower() { set(false); }
 };

+template <class Compat>
+using IntSourcePin = IntSourcePinBase;
+
 } // namespace gem5

 #endif //__DEV_INTPIN_HH__

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/66673?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I1325074d0ed1c8fc6dfece5ac1ee33872cc4f5e3
Gerrit-Change-Number: 66673
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-CC: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to