我对gem5很陌生,我来自C++。 也许这是Python的问题。 所以我在做教程,我不明白你是怎么知道System()对象有什么属性的。 例如,我可以在“创建一个简单的配置脚本”中看到,system有一个属性clk_domain,它对应于clockedObject。 但是System是一个继承自SimObject的类,它们都不继承自ClockedObject。 如有任何帮助,我们将不胜感激。 提前谢谢你。
gem5大量使用代码生成。
每个SimObject Python类都会在构建目录下自动生成一个param C++类,作为C++对象的构造函数传递。 这在https://cirosantilli.com/linux-kernel-module-cheat/#gem5-python-c-interaction中有更详细的描述,并且在查看gem5中的分支预测器的参数中也有提及
但是基本上,如果您在构建目录中grep生成的C++文件(忽略符号链接),您将能够理解所有内容。
clk_domain
的具体情况使用了稍微更神奇的parent.clk_domain
(大多数参数是整数或字符串),默认时钟节拍将其链接到其父级(在SimObject树中)clk_domain
:
class ClockedObject(SimObject):
type = 'ClockedObject'
abstract = True
cxx_header = "sim/clocked_object.hh"
# The clock domain this clocked object belongs to, inheriting the
# parent's clock domain by default
clk_domain = Param.ClockDomain(Parent.clk_domain, "Clock domain")
# Power model for this ClockedObject
power_model = VectorParam.PowerModel([], "Power models")
power_state = Param.PowerState(PowerState(), "Power state")
build/arm/params/clockedobject.hh
自动生成的类是:
struct ClockedObjectParams
: public SimObjectParams
{
ClockDomain * clk_domain;
std::vector< PowerModel * > power_model;
PowerState * power_state;
};
相应的pybind11绑定将该对象从python链接到C++:
static void
module_init(py::module &m_internal)
{
py::module m = m_internal.def_submodule("param_ClockedObject");
py::class_<ClockedObjectParams, SimObjectParams, std::unique_ptr<ClockedObjectParams, py::nodelete>>(m, "ClockedObjectParams")
.def_readwrite("clk_domain", &ClockedObjectParams::clk_domain)
.def_readwrite("power_model", &ClockedObjectParams::power_model)
.def_readwrite("power_state", &ClockedObjectParams::power_state)
;
py::class_<ClockedObject, SimObject, std::unique_ptr<ClockedObject, py::nodelete>>(m, "ClockedObject")
;
}
static EmbeddedPyBind embed_obj("ClockedObject", module_init, "SimObject");
然后,当创建C++ClockedObject
对象时,它在src/sim/clock_domain.hh处接收ClockedObjectParams
作为输入,其中包含:
class ClockDomain : public SimObject
{
public:
typedef ClockDomainParams Params;
ClockDomain(const Params *p, VoltageDomain *voltage_domain);
我还没有完全研究/理解它是如何使用那个类的,但是这应该可以澄清Python magic部分。