summaryrefslogtreecommitdiff
path: root/src/systemc/utils
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2018-10-01 01:22:39 -0700
committerGabe Black <gabeblack@google.com>2018-10-16 00:42:21 +0000
commit51361197ffd3045a83bc50fd2cf37555387489ad (patch)
tree601d7a83904262f804e8e1170e0156074f2b830f /src/systemc/utils
parent40e4a1c41895219732a610bc463bbe022523ad58 (diff)
downloadgem5-51361197ffd3045a83bc50fd2cf37555387489ad.tar.xz
systemc: Implement sc_vector.
Change-Id: I3cf096c4432fdf310fa1279da32620d5c9f57b5d Reviewed-on: https://gem5-review.googlesource.com/c/13197 Reviewed-by: Gabe Black <gabeblack@google.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/systemc/utils')
-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