port.hh revision 13321
1451SN/A/*
25795Ssaidi@eecs.umich.edu * Copyright 2018 Google, Inc.
3451SN/A *
4451SN/A * Redistribution and use in source and binary forms, with or without
5451SN/A * modification, are permitted provided that the following conditions are
6451SN/A * met: redistributions of source code must retain the above copyright
7451SN/A * notice, this list of conditions and the following disclaimer;
8451SN/A * redistributions in binary form must reproduce the above copyright
9451SN/A * notice, this list of conditions and the following disclaimer in the
10451SN/A * documentation and/or other materials provided with the distribution;
11451SN/A * neither the name of the copyright holders nor the names of its
12451SN/A * contributors may be used to endorse or promote products derived from
13451SN/A * this software without specific prior written permission.
14451SN/A *
15451SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16451SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17451SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18451SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19451SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20451SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21451SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22451SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23451SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24451SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25451SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26451SN/A *
272665Ssaidi@eecs.umich.edu * Authors: Gabe Black
282665Ssaidi@eecs.umich.edu */
29451SN/A
30451SN/A#ifndef __SYSTEMC_CORE_PORT_HH__
31451SN/A#define __SYSTEMC_CORE_PORT_HH__
32451SN/A
336215Snate@binkert.org#include <list>
346215Snate@binkert.org#include <typeinfo>
352093SN/A#include <vector>
362093SN/A
372093SN/A#include "base/cprintf.hh"
38451SN/A#include "systemc/ext/core/sc_interface.hh"
39451SN/A#include "systemc/ext/core/sc_port.hh"
40451SN/A
412093SN/Anamespace sc_gem5
422093SN/A{
435795Ssaidi@eecs.umich.edu
442093SN/Aclass StaticSensitivityPort;
453113Sgblack@eecs.umich.educlass StaticSensitivityFinder;
462423SN/Aclass Reset;
475795Ssaidi@eecs.umich.edu
485795Ssaidi@eecs.umich.educlass Port;
495795Ssaidi@eecs.umich.edu
502093SN/Aextern std::list<Port *> allPorts;
512093SN/A
522093SN/Aclass Port
532093SN/A{
542093SN/A  private:
553113Sgblack@eecs.umich.edu    ::sc_core::sc_port_base *portBase;
563113Sgblack@eecs.umich.edu
572093SN/A    bool finalized;
582093SN/A    int _maxSize;
592093SN/A    int _size;
602093SN/A
612093SN/A    bool regPortNeeded;
623122Sgblack@eecs.umich.edu
632093SN/A    void finalizePort(StaticSensitivityPort *port);
642093SN/A    void finalizeFinder(StaticSensitivityFinder *finder);
652093SN/A    void finalizeReset(Reset *reset);
663122Sgblack@eecs.umich.edu
672093SN/A    void
682093SN/A    addInterface(::sc_core::sc_interface *iface)
692093SN/A    {
703113Sgblack@eecs.umich.edu        portBase->_gem5AddInterface(iface);
713113Sgblack@eecs.umich.edu        _size++;
723113Sgblack@eecs.umich.edu    }
735543Ssaidi@eecs.umich.edu
745543Ssaidi@eecs.umich.edu    void
755543Ssaidi@eecs.umich.edu    addInterfaces(::sc_core::sc_port_base *pb)
765543Ssaidi@eecs.umich.edu    {
775543Ssaidi@eecs.umich.edu        // Only the ports farthest from the interfaces call register_port.
785543Ssaidi@eecs.umich.edu        pb->_gem5Port->regPortNeeded = false;
795543Ssaidi@eecs.umich.edu        for (int i = 0; i < pb->size(); i++)
805543Ssaidi@eecs.umich.edu            addInterface(pb->_gem5Interface(i));
815543Ssaidi@eecs.umich.edu    }
825543Ssaidi@eecs.umich.edu
835543Ssaidi@eecs.umich.edu    ::sc_core::sc_interface *
845543Ssaidi@eecs.umich.edu    getInterface(int i)
855543Ssaidi@eecs.umich.edu    {
865543Ssaidi@eecs.umich.edu        return portBase->_gem5Interface(i);
875543Ssaidi@eecs.umich.edu    }
885543Ssaidi@eecs.umich.edu
893113Sgblack@eecs.umich.edu    struct Binding
902093SN/A    {
912093SN/A        explicit Binding(::sc_core::sc_interface *interface) :
923113Sgblack@eecs.umich.edu            interface(interface), port(nullptr)
935543Ssaidi@eecs.umich.edu        {}
945543Ssaidi@eecs.umich.edu
955543Ssaidi@eecs.umich.edu        explicit Binding(::sc_core::sc_port_base *port) :
965543Ssaidi@eecs.umich.edu            interface(nullptr), port(port)
975543Ssaidi@eecs.umich.edu        {}
982093SN/A
995543Ssaidi@eecs.umich.edu        ::sc_core::sc_interface *interface;
1005543Ssaidi@eecs.umich.edu        ::sc_core::sc_port_base *port;
1015543Ssaidi@eecs.umich.edu    };
1025543Ssaidi@eecs.umich.edu
1035543Ssaidi@eecs.umich.edu    struct Sensitivity
1045543Ssaidi@eecs.umich.edu    {
1052093SN/A        Sensitivity(StaticSensitivityPort *port) :
1065543Ssaidi@eecs.umich.edu            port(port), finder(nullptr)
1075543Ssaidi@eecs.umich.edu        {}
1085543Ssaidi@eecs.umich.edu
1095543Ssaidi@eecs.umich.edu        Sensitivity(StaticSensitivityFinder *finder) :
1105543Ssaidi@eecs.umich.edu            port(nullptr), finder(finder)
1115543Ssaidi@eecs.umich.edu        {}
1125543Ssaidi@eecs.umich.edu
1133113Sgblack@eecs.umich.edu        StaticSensitivityPort *port;
1142093SN/A        StaticSensitivityFinder *finder;
1152093SN/A    };
1162093SN/A
1172093SN/A    std::vector<Binding *> bindings;
1182093SN/A    std::vector<Sensitivity *> sensitivities;
1192093SN/A    std::vector<Reset *> resets;
1205543Ssaidi@eecs.umich.edu
1215543Ssaidi@eecs.umich.edu  public:
1225543Ssaidi@eecs.umich.edu    static Port *
1235543Ssaidi@eecs.umich.edu    fromPort(const ::sc_core::sc_port_base *pb)
1245543Ssaidi@eecs.umich.edu    {
1252093SN/A        return pb->_gem5Port;
1262093SN/A    }
1272093SN/A
1282093SN/A    ::sc_core::sc_port_base *sc_port_base() { return portBase; }
1295543Ssaidi@eecs.umich.edu
1305543Ssaidi@eecs.umich.edu    Port(::sc_core::sc_port_base *port_base, int max) :
1312093SN/A        portBase(port_base), finalized(false), _maxSize(max), _size(0),
1322093SN/A        regPortNeeded(true)
1332093SN/A    {
1342093SN/A        allPorts.push_front(this);
1355543Ssaidi@eecs.umich.edu    }
1365543Ssaidi@eecs.umich.edu
1372093SN/A    ~Port() { allPorts.remove(this); }
1382093SN/A
1396683Stjones1@inf.ed.ac.uk    void
1406683Stjones1@inf.ed.ac.uk    bind(::sc_core::sc_interface *interface)
1416683Stjones1@inf.ed.ac.uk    {
1426683Stjones1@inf.ed.ac.uk        if (bindings.empty())
1436683Stjones1@inf.ed.ac.uk            addInterface(interface);
1446683Stjones1@inf.ed.ac.uk        else
1456683Stjones1@inf.ed.ac.uk            bindings.push_back(new Binding(interface));
1466683Stjones1@inf.ed.ac.uk    }
1476683Stjones1@inf.ed.ac.uk
1486683Stjones1@inf.ed.ac.uk    void
1496683Stjones1@inf.ed.ac.uk    bind(::sc_core::sc_port_base *port)
1502093SN/A    {
1512093SN/A        bindings.push_back(new Binding(port));
1522093SN/A    }
1532093SN/A
1542093SN/A    void sensitive(StaticSensitivityPort *port);
1552093SN/A    void sensitive(StaticSensitivityFinder *finder);
1562093SN/A    void addReset(Reset *reset);
1572093SN/A
1582093SN/A    void finalize();
1595543Ssaidi@eecs.umich.edu    void regPort();
1605543Ssaidi@eecs.umich.edu
1615543Ssaidi@eecs.umich.edu    int size() { return _size; }
1625543Ssaidi@eecs.umich.edu    int maxSize() { return _maxSize ? _maxSize : _size; }
1635543Ssaidi@eecs.umich.edu};
1645543Ssaidi@eecs.umich.edu
1655543Ssaidi@eecs.umich.edu} // namespace sc_gem5
1665543Ssaidi@eecs.umich.edu
1675543Ssaidi@eecs.umich.edu#endif // __SYSTEMC_CORE_PORT_HH__
1685543Ssaidi@eecs.umich.edu