From: Geoffrey Blake Date: Wed, 3 Sep 2014 11:43:03 +0000 (-0400) Subject: config: Add port splicing capability to PortRef class X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=31e4e475d93fa2cc9ee152e90347129413642c54;p=gem5.git config: Add port splicing capability to PortRef class The new configuration scripts need the ability to splice a simobject between a pair of ports that are already connected. The primary use case is when a CommMonitor needs to be created after the system is configured and then spliced between the pair of ports it will monitor. --- diff --git a/src/python/m5/params.py b/src/python/m5/params.py index dfc3ede3b..1f9a41d9e 100644 --- a/src/python/m5/params.py +++ b/src/python/m5/params.py @@ -1,4 +1,4 @@ -# Copyright (c) 2012-2013 ARM Limited +# Copyright (c) 2012-2014 ARM Limited # All rights reserved. # # The license below extends only to copyright in the software and shall @@ -1616,6 +1616,36 @@ class PortRef(object): "assigning non-port reference '%s' to port '%s'" \ % (other, 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): + if self.peer and not proxy.isproxy(self.peer): + if isinstance(new_master_peer, PortRef) and \ + isinstance(new_slave_peer, PortRef): + 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) + else: + panic("Port %s has unknown role, "+\ + "cannot splice in new peers\n", self) + else: + raise TypeError, \ + "Splicing non-port references '%s','%s' to port '%s'"\ + % (new_peer, peers_new_peer, self) + else: + fatal("Port %s not connected, cannot splice in new peers\n", self) + def clone(self, simobj, memo): if memo.has_key(self): return memo[self]