Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/18170
Change subject: python: Generalize the Port.splice function.
......................................................................
python: Generalize the Port.splice function.
Now that the MASTER and SLAVE roles aren't special, the splice function
needs to be able to handle arbitrarily role-d peers.
Change-Id: I22a28b7cdcb93f7f370730b7e38b0e6d3500a6a0
---
M src/python/m5/params.py
1 file changed, 26 insertions(+), 21 deletions(-)
diff --git a/src/python/m5/params.py b/src/python/m5/params.py
index f03a100..3319123 100644
--- a/src/python/m5/params.py
+++ b/src/python/m5/params.py
@@ -1899,35 +1899,40 @@
if other.peer is not self:
other.connect(self)
- # Allow a master/slave port pair to be spliced between
- # a port and its connected peer. Useful operation for connecting
- # instrumentation structures into a system when it is necessary
- # to connect the instrumentation after the full system has been
- # constructed.
- def splice(self, new_master_peer, new_slave_peer):
+ # Allow a compatible port pair to be spliced between a port and its
+ # connected peer. Useful operation for connecting instrumentation
+ # structures into a system when it is necessary to connect the
+ # instrumentation after the full system has been constructed.
+ def splice(self, new_peer_1, new_peer_2):
if not self.peer or proxy.isproxy(self.peer):
fatal("Port %s not connected, cannot splice in new peers\n",
self)
- if not isinstance(new_master_peer, PortRef) or \
- not isinstance(new_slave_peer, PortRef):
+ if not isinstance(new_peer_1, PortRef) or \
+ not isinstance(new_peer_2, PortRef):
raise TypeError(
"Splicing non-port references '%s','%s' to port '%s'" % \
- (new_master_peer, new_slave_peer, self))
+ (new_peer_1, new_peer_2, self))
old_peer = self.peer
- if self.role == 'SLAVE':
- self.peer = new_master_peer
- old_peer.peer = new_slave_peer
- new_master_peer.connect(self)
- new_slave_peer.connect(old_peer)
- elif self.role == 'MASTER':
- self.peer = new_slave_peer
- old_peer.peer = new_master_peer
- new_slave_peer.connect(self)
- new_master_peer.connect(old_peer)
+
+ peer_1_compat = Port._compat_dict[new_peer_1.role]
+ peer_2_compat = Port._compat_dict[new_peer_2.role]
+
+ if old_peer.role in peer_1_compat and self.role in peer_2_compat:
+ old_peer.peer = new_peer_1
+ new_peer_1.peer = old_peer
+ self.peer = new_peer_2
+ new_peer_2.peer = self
+ elif old_peer.role in peer_2_compat and self.role in peer_1_compat:
+ old_peer.peer = new_peer_2
+ new_peer_2.peer = old_peer
+ self.peer = new_peer_1
+ new_peer_1.peer = self
else:
- panic("Port %s has unknown role, "+\
- "cannot splice in new peers\n", self)
+ fatal("Ports %s(%s) and %s(%s) can't be compatibly spliced
with "
+ "%s(%s) and %s(%s)", self, self.role,
+ old_peer, old_peer.role, new_peer_1, new_peer_1.role,
+ new_peer_2, new_peer_2.role)
def clone(self, simobj, memo):
if self in memo:
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/18170
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I22a28b7cdcb93f7f370730b7e38b0e6d3500a6a0
Gerrit-Change-Number: 18170
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev