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