提问者:小点点

gem5中系统对象的属性


我对gem5很陌生,我来自C++。 也许这是Python的问题。 所以我在做教程,我不明白你是怎么知道System()对象有什么属性的。 例如,我可以在“创建一个简单的配置脚本”中看到,system有一个属性clk_domain,它对应于clockedObject。 但是System是一个继承自SimObject的类,它们都不继承自ClockedObject。 如有任何帮助,我们将不胜感激。 提前谢谢你。


共1个答案

匿名用户

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部分。