Ivory:如何使用 ivory-hw 包
Ivory: how to use the ivory-hw package
我正在试验 Ivory
(http://ivorylang.org, https://github.com/GaloisInc/ivory) 并使用 ivory-hw
模块来操作微控制器中的一些寄存器。
cmain :: Def ('[] :-> ())
cmain = voidProc "main" $ body $ do
setReg regFoo $ do
clearBit foo_bitbar
setBit foo_bitbaz
forever $ return ()
main_module :: Module
main_module = package "main" $ do
incl cmain
main :: IO ()
main = runCompiler [ main_module ] [] (initialOpts {constFold = True,
outDir = Just "out"})
建筑和运行给出:
$ exe
*** Procedure main
ERROR: [ No location available ]:
Unbound value: 'ivory_hw_io_write_u32'
exe: Sanity-check failed!
将选项 scErrors = False
添加到 runCompiler
将关闭健全性检查并且代码运行到完成生成源。
然而,main.c
包含对 ivory_hw_io_write_u32
的调用,但此函数未在任何地方定义(可能解释错误)。搜索 github,我可以找到包含文件 ivory_hw_prim.h
.
的示例
经过一些实验,我可以通过为硬件添加一个模块然后将其作为依赖项添加到我的 main_module
:
来包含它
hw_module :: Module
hw_module = package "ivory_hw_prim" hw_moduledef
main_module :: Module
main_module = package "main" $ do
depend hw_module
incl cmain
并调用添加了 hw_artifacts
的 runCompiler
以生成 header:
main = runCompiler [ main_module ] hw_artifacts (initialOpts {scErrors = False,
constFold = True,
outDir = Just "out"})
这会将 ivory_hw_prim.h
添加到生成的 collection 文件中,并在 main.h
.
中包含必要的包含
但是,这只能通过保留 runCompiler
的 scErrors = False
选项来实现,这表明我仍然没有做对。
因此我的问题是:Ivory的HW包的正确使用方法是什么?
解决方案是在包中包含hw_moduledef
:
main_module :: Module
main_module = package "main" $
incl cmain >> hw_moduledef
(depend
函数只包含 header。)在包 "main"
中包含 hw_moduledef
使其定义对 sanity-checker 可见。
顺便说一句,Ivory 模块系统可能会在未来得到改进,以便 Ivory 在编译时计算依赖关系,从而使程序员不必进行显式包含。
我正在试验 Ivory
(http://ivorylang.org, https://github.com/GaloisInc/ivory) 并使用 ivory-hw
模块来操作微控制器中的一些寄存器。
cmain :: Def ('[] :-> ())
cmain = voidProc "main" $ body $ do
setReg regFoo $ do
clearBit foo_bitbar
setBit foo_bitbaz
forever $ return ()
main_module :: Module
main_module = package "main" $ do
incl cmain
main :: IO ()
main = runCompiler [ main_module ] [] (initialOpts {constFold = True,
outDir = Just "out"})
建筑和运行给出:
$ exe
*** Procedure main
ERROR: [ No location available ]:
Unbound value: 'ivory_hw_io_write_u32'
exe: Sanity-check failed!
将选项 scErrors = False
添加到 runCompiler
将关闭健全性检查并且代码运行到完成生成源。
然而,main.c
包含对 ivory_hw_io_write_u32
的调用,但此函数未在任何地方定义(可能解释错误)。搜索 github,我可以找到包含文件 ivory_hw_prim.h
.
经过一些实验,我可以通过为硬件添加一个模块然后将其作为依赖项添加到我的 main_module
:
hw_module :: Module
hw_module = package "ivory_hw_prim" hw_moduledef
main_module :: Module
main_module = package "main" $ do
depend hw_module
incl cmain
并调用添加了 hw_artifacts
的 runCompiler
以生成 header:
main = runCompiler [ main_module ] hw_artifacts (initialOpts {scErrors = False,
constFold = True,
outDir = Just "out"})
这会将 ivory_hw_prim.h
添加到生成的 collection 文件中,并在 main.h
.
但是,这只能通过保留 runCompiler
的 scErrors = False
选项来实现,这表明我仍然没有做对。
因此我的问题是:Ivory的HW包的正确使用方法是什么?
解决方案是在包中包含hw_moduledef
:
main_module :: Module
main_module = package "main" $
incl cmain >> hw_moduledef
(depend
函数只包含 header。)在包 "main"
中包含 hw_moduledef
使其定义对 sanity-checker 可见。
顺便说一句,Ivory 模块系统可能会在未来得到改进,以便 Ivory 在编译时计算依赖关系,从而使程序员不必进行显式包含。