/*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* All rights reserved.
*
return flags;
}
-bool SimpleFlag::_active = false;
+bool Flag::_globalEnable = false;
Flag *
findFlag(const std::string &name)
}
void
-SimpleFlag::enableAll()
+Flag::globalEnable()
{
- _active = true;
+ _globalEnable = true;
for (auto& i : allFlags())
i.second->sync();
}
void
-SimpleFlag::disableAll()
+Flag::globalDisable()
{
- _active = false;
+ _globalEnable = false;
for (auto& i : allFlags())
i.second->sync();
}
k->disable();
}
+bool
+CompoundFlag::status() const
+{
+ if (_kids.empty())
+ return false;
+
+ for (auto& k : _kids) {
+ if (!k->status())
+ return false;
+ }
+
+ return true;
+}
bool
changeFlag(const char *s, bool value)
/*
+ * Copyright (c) 2020 ARM Limited
+ * All rights reserved
+ *
+ * The license below extends only to copyright in the software and shall
+ * not be construed as granting a license to any other intellectual
+ * property including but not limited to intellectual property relating
+ * to a hardware implementation of the functionality of the software
+ * licensed hereunder. You may use the software subject to the license
+ * terms below provided that you ensure that this notice is replicated
+ * unmodified and in its entirety in all distributions of the software,
+ * modified or unmodified, in source code or in binary form.
+ *
* Copyright (c) 2003-2005 The Regents of The University of Michigan
* Copyright (c) 2010 The Hewlett-Packard Development Company
* All rights reserved.
class Flag
{
protected:
+ static bool _globalEnable; // whether debug tracings are enabled
+
const char *_name;
const char *_desc;
+ virtual void sync() { }
+
public:
Flag(const char *name, const char *desc);
virtual ~Flag();
std::string name() const { return _name; }
std::string desc() const { return _desc; }
- virtual std::vector<Flag *> kids() { return std::vector<Flag*>(); }
virtual void enable() = 0;
virtual void disable() = 0;
- virtual void sync() {}
+ virtual bool status() const = 0;
+
+ operator bool() const { return status(); }
+ bool operator!() const { return !status(); }
+
+ static void globalEnable();
+ static void globalDisable();
};
class SimpleFlag : public Flag
{
- static bool _active; // whether debug tracings are enabled
protected:
bool _tracing; // tracing is enabled and flag is on
bool _status; // flag status
+ void sync() override { _tracing = _globalEnable && _status; }
+
public:
SimpleFlag(const char *name, const char *desc)
: Flag(name, desc), _status(false)
{ }
- bool status() const { return _tracing; }
- operator bool() const { return _tracing; }
- bool operator!() const { return !_tracing; }
-
- void enable() { _status = true; sync(); }
- void disable() { _status = false; sync(); }
-
- void sync() { _tracing = _active && _status; }
+ bool status() const override { return _tracing; }
- static void enableAll();
- static void disableAll();
+ void enable() override { _status = true; sync(); }
+ void disable() override { _status = false; sync(); }
};
class CompoundFlag : public Flag
{
}
- std::vector<Flag *> kids() { return _kids; }
+ const std::vector<Flag *> &kids() const { return _kids; }
- void enable();
- void disable();
+ void enable() override;
+ void disable() override;
+ bool status() const override;
};
typedef std::map<std::string, Flag *> FlagsMap;
void
enable()
{
- Debug::SimpleFlag::enableAll();
+ Debug::Flag::globalEnable();
}
void
disable()
{
- Debug::SimpleFlag::disableAll();
+ Debug::Flag::globalDisable();
}
ObjectMatch ignore;
from m5.util import printList
def help():
+ sorted_flags = sorted(flags.items(), key=lambda kv: kv[0])
+
print("Base Flags:")
- for name in sorted(flags):
- if name == 'All':
- continue
- flag = flags[name]
- children = [c for c in flag.kids() ]
- if not children:
- print(" %s: %s" % (name, flag.desc()))
+ for name, flag in filter(lambda kv: not isinstance(kv[1], CompoundFlag),
+ sorted_flags):
+ print(" %s: %s" % (name, flag.desc))
print()
print("Compound Flags:")
- for name in sorted(flags):
- if name == 'All':
- continue
- flag = flags[name]
- children = [c for c in flag.kids() ]
- if children:
- print(" %s: %s" % (name, flag.desc()))
- printList([ c.name() for c in children ], indent=8)
+ for name, flag in filter(lambda kv: isinstance(kv[1], CompoundFlag),
+ sorted_flags):
+ print(" %s: %s" % (name, flag.desc))
+ printList([ c.name for c in flag.kids() ], indent=8)
print()
class AllFlags(Mapping):
/*
- * Copyright (c) 2017 ARM Limited
+ * Copyright (c) 2017, 2020 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
py::class_<Debug::Flag> c_flag(m_debug, "Flag");
c_flag
- .def("name", &Debug::Flag::name)
- .def("desc", &Debug::Flag::desc)
- .def("kids", &Debug::Flag::kids)
+ .def_property_readonly("name", &Debug::Flag::name)
+ .def_property_readonly("desc", &Debug::Flag::desc)
.def("enable", &Debug::Flag::enable)
.def("disable", &Debug::Flag::disable)
- .def("sync", &Debug::Flag::sync)
;
py::class_<Debug::SimpleFlag>(m_debug, "SimpleFlag", c_flag);
- py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag);
+ py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag)
+ .def("kids", &Debug::CompoundFlag::kids)
+ ;
py::module m_trace = m_native.def_submodule("trace");