System object的clk_domain等属性在gem5中如何在Python和C++之间传递?

How are attributes such as clk_domain of the System object passed between Python and C++ in gem5?

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

gem5 大量使用代码生成。

每个 SimObject Python class 在构建目录下自动生成一个参数 C++ class,作为 C++ 对象的构造函数传递。这在以下位置有更详细的描述:https://cirosantilli.com/linux-kernel-module-cheat/#gem5-python-c-interaction and was also mentioned at: Viewing the parameters of the branch predictor in gem5

但基本上,如果你在构建目录中对生成的 C++ 文件进行 grep(忽略 symlinks,scons sets up to point back to the main source tree),你将能够理解所有内容。

我还没有完全studied/understood具体是如何使用ClockedObject的,但下面至少应该把Python/C++魔法交互部分说清楚

ClockedObject.clk_domain 的具体情况,参数的默认值是 hte magic Parent.clk_domain,它 link 将它传给它的父级(在 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")

自动生成的 class build/ARM/params/ClockedObject.hh 是:

struct ClockedObjectParams
    : public SimObjectParams
{
    ClockDomain * clk_domain;
    std::vector< PowerModel * > power_model;
    PowerState * power_state;
};

和相应的 pybind11 绑定 link 从 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 对象被创建时(这也是在完整的 SimObject 树被构建后通过绑定来自 Python ),它接收 ClockedObjectParams 作为输入在 src/sim/clock_domain.hh,其中包含:

class ClockDomain : public SimObject
{

  public:

    typedef ClockDomainParams Params;
    ClockDomain(const Params *p, VoltageDomain *voltage_domain);

看fs.py,clk_domain其实是一个SrcClockDomain初始化为:

    # Create a source clock for the system and set the clock period
    test_sys.clk_domain = SrcClockDomain(clock =  options.sys_clock,
            voltage_domain = test_sys.voltage_domain)

但事情是类似的,有一个 Python SrcClockDomain 继承自 ClockDomain 和相应的 C++ classes.

在 gem5 3ca404da175a66e0b958165ad75eb5f54cb5e772 中观察到。