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