我想有一个具有接口和注册银行的DML设备作为我的设备的顶层,但将处理卸载到Python。是否有从DML调用Python的轻量级方法?
这篇文章我如何单元测试一个特定的DML方法?地址从Python调用到DML,但我感兴趣的是相反的。
我想我可以创建一堆自定义接口来做到这一点,但我想知道是否有更好的方法。
用Python实现设备的部分可以是有意义的,特别是对于很少调用的代码(想到用户交互),以及当面对像字符串操作这样的任务时,类c语言的缺点特别令人痛苦,或者当需要与CLI命令共享代码时。
您可以使用SIM_call_python_function
API从DML调用Python。该函数在传递的字符串上使用等价的eval
,因此您可以通过__import__
找到模块局部函数:
local attr_value_t a = SIM_make_attr_list(0);
local attr_value_t result = SIM_call_python_function(
"__import__('simics').SIM_version", &a);
log info: "%s", SIM_attr_string(result);
SIM_attr_free(&a);
SIM_attr_free(&result);
这个API确实不是很漂亮。DML 1.2的部分标准库实际上是用Python编写的,并使用内部函数VT_call_python_module_function
来完成此任务。这个API更好,但我们不建议在核心Simics团队之外使用VT_
函数。
这个问题更多的是关于Simics模拟器框架,而不是关于DML。考虑到Simics的工作方式,Python代码存在于一个单独的上下文中。没有明显的轻量级方法。相反,您需要将Python代码放在单独的Python类和单独的运行时对象中,并使用Simics模拟器接口来编排调用。
Python代码通常无法访问对象的状态,因此它必须是严格的"计算this并返回所有计算值"。这对于设备行为来说不是很方便,因为设备行为实际上都是关于改变对象的状态。
即使有一堆接口,仍然存在状态处理的问题。我猜你也需要一个接口。