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 中观察到。
我是 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 中观察到。