diff options
Diffstat (limited to 'src/systemc/utils/sc_vector.cc')
-rw-r--r-- | src/systemc/utils/sc_vector.cc | 81 |
1 files changed, 73 insertions, 8 deletions
diff --git a/src/systemc/utils/sc_vector.cc b/src/systemc/utils/sc_vector.cc index ed59b734f..985253995 100644 --- a/src/systemc/utils/sc_vector.cc +++ b/src/systemc/utils/sc_vector.cc @@ -1,3 +1,22 @@ +/***************************************************************************** + + Licensed to Accellera Systems Initiative Inc. (Accellera) under one or + more contributor license agreements. See the NOTICE file distributed + with this work for additional information regarding copyright ownership. + Accellera licenses this file to you under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with the + License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied. See the License for the specific language governing + permissions and limitations under the License. + + *****************************************************************************/ + /* * Copyright 2018 Google, Inc. * @@ -27,23 +46,69 @@ * Authors: Gabe Black */ +#include <sstream> + +#include "base/cprintf.hh" +#include "systemc/core/object.hh" +#include "systemc/ext/utils/sc_report_handler.hh" #include "systemc/ext/utils/sc_vector.hh" namespace sc_core { -sc_vector_base::size_type -sc_vector_base::size() const -{ - sc_utils_warn_unimpl(__PRETTY_FUNCTION__); - return 0; -} +sc_vector_base::size_type sc_vector_base::size() const { return objs.size(); } const std::vector<sc_object *> & sc_vector_base::get_elements() const { - sc_utils_warn_unimpl(__PRETTY_FUNCTION__); - return *(const std::vector<sc_object *> *)nullptr; + elements.clear(); + for (auto ptr: objs) { + sc_object *obj_ptr = objectCast(ptr); + if (obj_ptr) + elements.push_back(obj_ptr); + } + return elements; +} + +void +sc_vector_base::checkIndex(size_type index) const +{ + if (index >= size()) { + std::ostringstream ss; + ccprintf(ss, "%s[%d] >= size() = %d", name(), index, size()); + SC_REPORT_ERROR("(E5) out of bounds", ss.str().c_str()); + sc_abort(); + } +} + +void +sc_vector_base::forceParent() const +{ + sc_gem5::pushParentObj(get_parent_object()); +} + +void +sc_vector_base::unforceParent() const +{ + sc_gem5::popParentObj(); +} + +void +sc_vector_base::reportEmpty(const char *kind_, bool empty_dest) const +{ + std::ostringstream ss; + + ss << "target `" << name() << "' " << "(" << kind_ << ") "; + + if (!size()) + ss << "not initialised yet"; + else if (empty_dest) + ss << "empty range given"; + else + ss << "empty destination range given"; + + SC_REPORT_WARNING("(W807) sc_vector::bind called with empty range", + ss.str().c_str()); } } // namespace sc_core |