sc_signal.cc revision 13278:a059617d0d44
11376Sbinkertn@umich.edu/*
21376Sbinkertn@umich.edu * Copyright 2018 Google, Inc.
31376Sbinkertn@umich.edu *
41376Sbinkertn@umich.edu * Redistribution and use in source and binary forms, with or without
51376Sbinkertn@umich.edu * modification, are permitted provided that the following conditions are
61376Sbinkertn@umich.edu * met: redistributions of source code must retain the above copyright
71376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer;
81376Sbinkertn@umich.edu * redistributions in binary form must reproduce the above copyright
91376Sbinkertn@umich.edu * notice, this list of conditions and the following disclaimer in the
101376Sbinkertn@umich.edu * documentation and/or other materials provided with the distribution;
111376Sbinkertn@umich.edu * neither the name of the copyright holders nor the names of its
121376Sbinkertn@umich.edu * contributors may be used to endorse or promote products derived from
131376Sbinkertn@umich.edu * this software without specific prior written permission.
141376Sbinkertn@umich.edu *
151376Sbinkertn@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
161376Sbinkertn@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
171376Sbinkertn@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
181376Sbinkertn@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
191376Sbinkertn@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
201376Sbinkertn@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
211376Sbinkertn@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
221376Sbinkertn@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
231376Sbinkertn@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
241376Sbinkertn@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
251376Sbinkertn@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
261376Sbinkertn@umich.edu *
271376Sbinkertn@umich.edu * Authors: Gabe Black
281376Sbinkertn@umich.edu */
291376Sbinkertn@umich.edu
301376Sbinkertn@umich.edu#include <sstream>
311385Sbinkertn@umich.edu
321376Sbinkertn@umich.edu#include "systemc/core/scheduler.hh"
331816Sbinkertn@umich.edu#include "systemc/ext/channel/sc_signal.hh"
341376Sbinkertn@umich.edu#include "systemc/ext/core/sc_main.hh"
351816Sbinkertn@umich.edu
361376Sbinkertn@umich.edunamespace sc_gem5
371385Sbinkertn@umich.edu{
381385Sbinkertn@umich.edu
391385Sbinkertn@umich.eduScSignalBase::ScSignalBase(const char *name) :
401385Sbinkertn@umich.edu    sc_core::sc_prim_channel(name), _changeStamp(~0ULL),
411385Sbinkertn@umich.edu    _gem5WriterPort(nullptr)
421385Sbinkertn@umich.edu{}
431385Sbinkertn@umich.edu
441816Sbinkertn@umich.eduScSignalBase::~ScSignalBase() {}
451816Sbinkertn@umich.edu
461816Sbinkertn@umich.educonst sc_core::sc_event &
471816Sbinkertn@umich.eduScSignalBase::defaultEvent() const
481816Sbinkertn@umich.edu{
491816Sbinkertn@umich.edu    return valueChangedEvent();
501816Sbinkertn@umich.edu}
511816Sbinkertn@umich.edu
521816Sbinkertn@umich.educonst sc_core::sc_event &
531816Sbinkertn@umich.eduScSignalBase::valueChangedEvent() const
541816Sbinkertn@umich.edu{
551816Sbinkertn@umich.edu    return _valueChangedEvent;
561816Sbinkertn@umich.edu}
571816Sbinkertn@umich.edu
581816Sbinkertn@umich.edubool
591816Sbinkertn@umich.eduScSignalBase::event() const
601816Sbinkertn@umich.edu{
611816Sbinkertn@umich.edu    return _changeStamp == getChangeStamp();
621816Sbinkertn@umich.edu}
631816Sbinkertn@umich.edu
641816Sbinkertn@umich.eduvoid
651816Sbinkertn@umich.eduScSignalBase::_signalChange()
661816Sbinkertn@umich.edu{
671816Sbinkertn@umich.edu    _changeStamp = getChangeStamp();
681816Sbinkertn@umich.edu    _valueChangedEvent.notify(sc_core::SC_ZERO_TIME);
691816Sbinkertn@umich.edu}
701816Sbinkertn@umich.edu
711816Sbinkertn@umich.edunamespace
721816Sbinkertn@umich.edu{
731816Sbinkertn@umich.edu
741816Sbinkertn@umich.eduvoid
751816Sbinkertn@umich.edureportSignalError(ScSignalBase *sig, sc_core::sc_object *first,
761385Sbinkertn@umich.edu        sc_core::sc_object *second, bool delta_conflict=false)
771376Sbinkertn@umich.edu{
781376Sbinkertn@umich.edu    std::ostringstream ss;
791376Sbinkertn@umich.edu    ss << "\n signal " << "`" << sig->name() << "' (" << sig->kind() << ")";
801602Sbinkertn@umich.edu    ss << "\n first driver `" << first->name() << "' (" <<
811376Sbinkertn@umich.edu        first->kind() << ")";
821376Sbinkertn@umich.edu    ss << "\n second driver `" << second->name() << "' (" <<
831376Sbinkertn@umich.edu        second->kind() << ")";
841376Sbinkertn@umich.edu    if (delta_conflict) {
851602Sbinkertn@umich.edu        ss << "\n conflicting write in delta cycle " <<
861376Sbinkertn@umich.edu            sc_core::sc_delta_count();
871376Sbinkertn@umich.edu    }
881602Sbinkertn@umich.edu    SC_REPORT_ERROR(
891602Sbinkertn@umich.edu            "(E115) sc_signal<T> cannot have more than one driver",
901376Sbinkertn@umich.edu            ss.str().c_str());
911376Sbinkertn@umich.edu}
921376Sbinkertn@umich.edu
931376Sbinkertn@umich.edu} // anonymous namespace
941376Sbinkertn@umich.edu
951376Sbinkertn@umich.eduWriteChecker<sc_core::SC_ONE_WRITER>::WriteChecker(ScSignalBase *_sig) :
961376Sbinkertn@umich.edu    sig(_sig), firstPort(nullptr), proc(nullptr), writeStamp(~0ULL)
971376Sbinkertn@umich.edu{}
981376Sbinkertn@umich.edu
991602Sbinkertn@umich.eduvoid
1001376Sbinkertn@umich.eduWriteChecker<sc_core::SC_ONE_WRITER>::checkPort(sc_core::sc_port_base &port,
1011376Sbinkertn@umich.edu        std::string iface_type_name, std::string out_name)
1021376Sbinkertn@umich.edu{
1031376Sbinkertn@umich.edu    if (iface_type_name == out_name) {
1041376Sbinkertn@umich.edu        if (firstPort)
1051376Sbinkertn@umich.edu            reportSignalError(sig, firstPort, &port);
1061376Sbinkertn@umich.edu        firstPort = &port;
1071376Sbinkertn@umich.edu    }
1081376Sbinkertn@umich.edu}
1091376Sbinkertn@umich.edu
1101385Sbinkertn@umich.eduvoid
1111602Sbinkertn@umich.eduWriteChecker<sc_core::SC_ONE_WRITER>::checkWriter()
1121381Sbinkertn@umich.edu{
1131381Sbinkertn@umich.edu    Process *p = scheduler.current();
1141376Sbinkertn@umich.edu    if (!p)
1151381Sbinkertn@umich.edu        return;
1161381Sbinkertn@umich.edu    uint64_t stamp = getChangeStamp();
1171381Sbinkertn@umich.edu    if (proc && proc != p)
1181376Sbinkertn@umich.edu        reportSignalError(sig, proc, p);
1191381Sbinkertn@umich.edu    proc = p;
1201376Sbinkertn@umich.edu    writeStamp = stamp;
1211381Sbinkertn@umich.edu}
1221376Sbinkertn@umich.edu
1231376Sbinkertn@umich.eduWriteChecker<sc_core::SC_MANY_WRITERS>::WriteChecker(ScSignalBase *_sig) :
1241602Sbinkertn@umich.edu    sig(_sig), proc(nullptr), writeStamp(~0ULL)
1251602Sbinkertn@umich.edu{}
1261381Sbinkertn@umich.edu
1271376Sbinkertn@umich.eduvoid
1281381Sbinkertn@umich.eduWriteChecker<sc_core::SC_MANY_WRITERS>::checkPort(sc_core::sc_port_base &port,
1291381Sbinkertn@umich.edu        std::string iface_type_name, std::string out_name)
1301381Sbinkertn@umich.edu{
1311376Sbinkertn@umich.edu    return;
1321376Sbinkertn@umich.edu}
1331381Sbinkertn@umich.edu
1341381Sbinkertn@umich.eduvoid
1351381Sbinkertn@umich.eduWriteChecker<sc_core::SC_MANY_WRITERS>::checkWriter()
1361376Sbinkertn@umich.edu{
1371376Sbinkertn@umich.edu    Process *p = scheduler.current();
1381376Sbinkertn@umich.edu    if (!p)
1391381Sbinkertn@umich.edu        return;
1401385Sbinkertn@umich.edu    uint64_t stamp = getChangeStamp();
1411385Sbinkertn@umich.edu    if (writeStamp == stamp && proc && proc != p)
1421816Sbinkertn@umich.edu        reportSignalError(sig, proc, p, writeStamp == stamp);
1431376Sbinkertn@umich.edu    proc = p;
1441376Sbinkertn@umich.edu    writeStamp = stamp;
1451376Sbinkertn@umich.edu}
1461602Sbinkertn@umich.edu
1471376Sbinkertn@umich.eduScSignalBaseBinary::ScSignalBaseBinary(const char *_name) :
1481376Sbinkertn@umich.edu    ScSignalBase(_name), _posStamp(~0ULL), _negStamp(~0ULL)
1491376Sbinkertn@umich.edu{}
1501376Sbinkertn@umich.edu
1511376Sbinkertn@umich.educonst sc_core::sc_event &
1521376Sbinkertn@umich.eduScSignalBaseBinary::posedgeEvent() const
1531376Sbinkertn@umich.edu{
1541376Sbinkertn@umich.edu    return _posedgeEvent;
1551376Sbinkertn@umich.edu}
1561376Sbinkertn@umich.edu
1571376Sbinkertn@umich.educonst sc_core::sc_event &
1581376Sbinkertn@umich.eduScSignalBaseBinary::negedgeEvent() const
1591376Sbinkertn@umich.edu{
1601376Sbinkertn@umich.edu    return _negedgeEvent;
1611376Sbinkertn@umich.edu}
1621376Sbinkertn@umich.edu
1631376Sbinkertn@umich.edubool
1641376Sbinkertn@umich.eduScSignalBaseBinary::posedge() const
1651376Sbinkertn@umich.edu{
1661376Sbinkertn@umich.edu    return _posStamp == getChangeStamp();
1671376Sbinkertn@umich.edu}
1681376Sbinkertn@umich.edubool
1691376Sbinkertn@umich.edu
1701376Sbinkertn@umich.eduScSignalBaseBinary::negedge() const
1711383Sbinkertn@umich.edu{
1721376Sbinkertn@umich.edu    return _negStamp == getChangeStamp();
1731376Sbinkertn@umich.edu}
1741383Sbinkertn@umich.edu
1751376Sbinkertn@umich.edu} // namespace sc_gem5
1761376Sbinkertn@umich.edu