summaryrefslogtreecommitdiff
path: root/src/systemc/utils/sc_vector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/systemc/utils/sc_vector.cc')
-rw-r--r--src/systemc/utils/sc_vector.cc81
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