在GEM5中,Python和C++之间的系统对象的CKKLUnter属性是如何传递的?

2024-05-13 13:20:18 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 对象脚本属性domain系统教程systemclk
1条回答
网友
1楼 · 发布于 2024-05-13 13:20:18

gem5大量使用代码生成

每个SimBubject Python类在生成目录下自动生成PARAM C++类,该类作为C++对象的构造函数传递。这在:https://cirosantilli.com/linux-kernel-module-cheat/#gem5-python-c-interaction中有进一步的详细描述,在:Viewing the parameters of the branch predictor in gem5中也有提及

基本上,如果您在生成目录中生成生成的C++文件(忽略SyrSink,即{A3}),您将能够理解所有的内容。p>

我还没有完全研究/理解ClockedObject是如何使用的,但下面应该至少澄清Python/C++魔术交互部分

ClockedObject.clk_domain的特定情况下,参数的默认值为hte magic 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++(^){CD5>}对象被创建时(这也是从Python中的完整的SIMOBECT树建立之后的绑定),它接收到{{CD6>}作为SRC/SIM/CordLyDimaNin的输入。

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 ^ {CD8>},它继承自^ {< CD10>}和相应的C++类。

在gem5 3ca404da175a66e0b958165ad75eb5f54cb5e772中观察到

相关问题 更多 >