port.hh revision 13239
16691Stjones1@inf.ed.ac.uk/*
26691Stjones1@inf.ed.ac.uk * Copyright 2018 Google, Inc.
36691Stjones1@inf.ed.ac.uk *
46691Stjones1@inf.ed.ac.uk * Redistribution and use in source and binary forms, with or without
56691Stjones1@inf.ed.ac.uk * modification, are permitted provided that the following conditions are
66691Stjones1@inf.ed.ac.uk * met: redistributions of source code must retain the above copyright
76691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer;
86691Stjones1@inf.ed.ac.uk * redistributions in binary form must reproduce the above copyright
96691Stjones1@inf.ed.ac.uk * notice, this list of conditions and the following disclaimer in the
106691Stjones1@inf.ed.ac.uk * documentation and/or other materials provided with the distribution;
116691Stjones1@inf.ed.ac.uk * neither the name of the copyright holders nor the names of its
126691Stjones1@inf.ed.ac.uk * contributors may be used to endorse or promote products derived from
136691Stjones1@inf.ed.ac.uk * this software without specific prior written permission.
146691Stjones1@inf.ed.ac.uk *
156691Stjones1@inf.ed.ac.uk * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
166691Stjones1@inf.ed.ac.uk * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
176691Stjones1@inf.ed.ac.uk * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
186691Stjones1@inf.ed.ac.uk * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
196691Stjones1@inf.ed.ac.uk * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
206691Stjones1@inf.ed.ac.uk * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
216691Stjones1@inf.ed.ac.uk * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
226691Stjones1@inf.ed.ac.uk * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
236691Stjones1@inf.ed.ac.uk * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
246691Stjones1@inf.ed.ac.uk * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
256691Stjones1@inf.ed.ac.uk * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
266691Stjones1@inf.ed.ac.uk *
276691Stjones1@inf.ed.ac.uk * Authors: Gabe Black
286691Stjones1@inf.ed.ac.uk */
296691Stjones1@inf.ed.ac.uk
306691Stjones1@inf.ed.ac.uk#ifndef __SYSTEMC_CORE_PORT_HH__
316691Stjones1@inf.ed.ac.uk#define __SYSTEMC_CORE_PORT_HH__
326691Stjones1@inf.ed.ac.uk
336691Stjones1@inf.ed.ac.uk#include <list>
346691Stjones1@inf.ed.ac.uk#include <vector>
356691Stjones1@inf.ed.ac.uk
366691Stjones1@inf.ed.ac.uk#include "base/cprintf.hh"
376691Stjones1@inf.ed.ac.uk#include "systemc/ext/core/sc_interface.hh"
386691Stjones1@inf.ed.ac.uk#include "systemc/ext/core/sc_port.hh"
396691Stjones1@inf.ed.ac.uk
406691Stjones1@inf.ed.ac.uknamespace sc_gem5
416691Stjones1@inf.ed.ac.uk{
426691Stjones1@inf.ed.ac.uk
436691Stjones1@inf.ed.ac.ukclass StaticSensitivityPort;
446691Stjones1@inf.ed.ac.ukclass StaticSensitivityFinder;
456691Stjones1@inf.ed.ac.uk
466691Stjones1@inf.ed.ac.ukclass Port;
476691Stjones1@inf.ed.ac.uk
486691Stjones1@inf.ed.ac.ukextern std::list<Port *> allPorts;
496691Stjones1@inf.ed.ac.uk
506691Stjones1@inf.ed.ac.ukclass Port
516691Stjones1@inf.ed.ac.uk{
526691Stjones1@inf.ed.ac.uk  private:
536691Stjones1@inf.ed.ac.uk    ::sc_core::sc_port_base *portBase;
546691Stjones1@inf.ed.ac.uk
556691Stjones1@inf.ed.ac.uk    bool finalized;
566691Stjones1@inf.ed.ac.uk    int _maxSize;
576691Stjones1@inf.ed.ac.uk    int _size;
586691Stjones1@inf.ed.ac.uk
596691Stjones1@inf.ed.ac.uk    void finalizePort(StaticSensitivityPort *port);
606691Stjones1@inf.ed.ac.uk    void finalizeFinder(StaticSensitivityFinder *finder);
616691Stjones1@inf.ed.ac.uk
626691Stjones1@inf.ed.ac.uk    void
636691Stjones1@inf.ed.ac.uk    addInterface(::sc_core::sc_interface *iface)
646691Stjones1@inf.ed.ac.uk    {
656691Stjones1@inf.ed.ac.uk        for (int i = 0; i < _size; i++) {
666691Stjones1@inf.ed.ac.uk            if (getInterface(i) == iface) {
676691Stjones1@inf.ed.ac.uk                std::string msg =
686691Stjones1@inf.ed.ac.uk                    csprintf("interface already bound to port: port '%s' (%s)",
696691Stjones1@inf.ed.ac.uk                        portBase->name(), portBase->kind());
706691Stjones1@inf.ed.ac.uk                SC_REPORT_ERROR("(E107) bind interface to port failed",
716691Stjones1@inf.ed.ac.uk                        msg.c_str());
726691Stjones1@inf.ed.ac.uk            }
736691Stjones1@inf.ed.ac.uk        }
746691Stjones1@inf.ed.ac.uk        _size++;
756691Stjones1@inf.ed.ac.uk        portBase->_gem5AddInterface(iface);
766691Stjones1@inf.ed.ac.uk    }
776691Stjones1@inf.ed.ac.uk
786691Stjones1@inf.ed.ac.uk    void
796691Stjones1@inf.ed.ac.uk    addInterfaces(::sc_core::sc_port_base *pb)
806691Stjones1@inf.ed.ac.uk    {
816691Stjones1@inf.ed.ac.uk        for (int i = 0; i < pb->size(); i++)
826691Stjones1@inf.ed.ac.uk            addInterface(pb->_gem5Interface(i));
836691Stjones1@inf.ed.ac.uk    }
846691Stjones1@inf.ed.ac.uk
856691Stjones1@inf.ed.ac.uk    ::sc_core::sc_interface *
866691Stjones1@inf.ed.ac.uk    getInterface(int i)
876691Stjones1@inf.ed.ac.uk    {
886691Stjones1@inf.ed.ac.uk        return portBase->_gem5Interface(i);
8912616Sgabeblack@google.com    }
906691Stjones1@inf.ed.ac.uk
919552Sandreas.hansson@arm.com    struct Binding
929552Sandreas.hansson@arm.com    {
939552Sandreas.hansson@arm.com        explicit Binding(::sc_core::sc_interface *interface) :
9412616Sgabeblack@google.com            interface(interface), port(nullptr)
9512616Sgabeblack@google.com        {}
966691Stjones1@inf.ed.ac.uk
976691Stjones1@inf.ed.ac.uk        explicit Binding(::sc_core::sc_port_base *port) :
986691Stjones1@inf.ed.ac.uk            interface(nullptr), port(port)
996691Stjones1@inf.ed.ac.uk        {}
1006691Stjones1@inf.ed.ac.uk
1016691Stjones1@inf.ed.ac.uk        ::sc_core::sc_interface *interface;
1026691Stjones1@inf.ed.ac.uk        ::sc_core::sc_port_base *port;
1036691Stjones1@inf.ed.ac.uk    };
1046691Stjones1@inf.ed.ac.uk
1056691Stjones1@inf.ed.ac.uk    struct Sensitivity
1066691Stjones1@inf.ed.ac.uk    {
1076691Stjones1@inf.ed.ac.uk        Sensitivity(StaticSensitivityPort *port) :
1086691Stjones1@inf.ed.ac.uk            port(port), finder(nullptr)
1096691Stjones1@inf.ed.ac.uk        {}
1106691Stjones1@inf.ed.ac.uk
1116691Stjones1@inf.ed.ac.uk        Sensitivity(StaticSensitivityFinder *finder) :
1126691Stjones1@inf.ed.ac.uk            port(nullptr), finder(finder)
1136691Stjones1@inf.ed.ac.uk        {}
1146691Stjones1@inf.ed.ac.uk
1156691Stjones1@inf.ed.ac.uk        StaticSensitivityPort *port;
1166691Stjones1@inf.ed.ac.uk        StaticSensitivityFinder *finder;
1176691Stjones1@inf.ed.ac.uk    };
1186691Stjones1@inf.ed.ac.uk
11912616Sgabeblack@google.com    std::vector<Binding *> bindings;
1206691Stjones1@inf.ed.ac.uk    std::vector<Sensitivity *> sensitivities;
1219552Sandreas.hansson@arm.com
1229552Sandreas.hansson@arm.com  public:
1239552Sandreas.hansson@arm.com    static Port *
12412616Sgabeblack@google.com    fromPort(const ::sc_core::sc_port_base *pb)
12512616Sgabeblack@google.com    {
1266691Stjones1@inf.ed.ac.uk        return pb->_gem5Port;
1276691Stjones1@inf.ed.ac.uk    }
1286691Stjones1@inf.ed.ac.uk
1296691Stjones1@inf.ed.ac.uk    ::sc_core::sc_port_base *sc_port_base() { return portBase; }
1306691Stjones1@inf.ed.ac.uk
1316691Stjones1@inf.ed.ac.uk    Port(::sc_core::sc_port_base *port_base, int max) :
1326691Stjones1@inf.ed.ac.uk        portBase(port_base), finalized(false), _maxSize(max), _size(0)
1336691Stjones1@inf.ed.ac.uk    {
1346691Stjones1@inf.ed.ac.uk        allPorts.push_front(this);
1356691Stjones1@inf.ed.ac.uk    }
1366691Stjones1@inf.ed.ac.uk
1376691Stjones1@inf.ed.ac.uk    void
1386691Stjones1@inf.ed.ac.uk    bind(::sc_core::sc_interface *interface)
1396691Stjones1@inf.ed.ac.uk    {
1406691Stjones1@inf.ed.ac.uk        bindings.push_back(new Binding(interface));
1416691Stjones1@inf.ed.ac.uk    }
1426691Stjones1@inf.ed.ac.uk
1436691Stjones1@inf.ed.ac.uk    void
1446691Stjones1@inf.ed.ac.uk    bind(::sc_core::sc_port_base *port)
1456691Stjones1@inf.ed.ac.uk    {
1466691Stjones1@inf.ed.ac.uk        bindings.push_back(new Binding(port));
1476691Stjones1@inf.ed.ac.uk    }
1486691Stjones1@inf.ed.ac.uk
1496691Stjones1@inf.ed.ac.uk    void sensitive(StaticSensitivityPort *port);
1506691Stjones1@inf.ed.ac.uk    void sensitive(StaticSensitivityFinder *finder);
1516691Stjones1@inf.ed.ac.uk
1526691Stjones1@inf.ed.ac.uk    void finalize();
1536691Stjones1@inf.ed.ac.uk
1546691Stjones1@inf.ed.ac.uk    int size() { return _size; }
1556691Stjones1@inf.ed.ac.uk    int maxSize() { return _maxSize; }
1566691Stjones1@inf.ed.ac.uk};
1576691Stjones1@inf.ed.ac.uk
1586691Stjones1@inf.ed.ac.uk} // namespace sc_gem5
1596691Stjones1@inf.ed.ac.uk
1606691Stjones1@inf.ed.ac.uk#endif // __SYSTEMC_CORE_PORT_HH__
1616691Stjones1@inf.ed.ac.uk