Vhdl 是否可以将Sphinx automodule扩展到Python以外的域?
我希望使用Sphinx来记录VHDL源代码。理想情况下,我希望能够采用如下VHDL类型:Vhdl 是否可以将Sphinx automodule扩展到Python以外的域?,vhdl,python-sphinx,Vhdl,Python Sphinx,我希望使用Sphinx来记录VHDL源代码。理想情况下,我希望能够采用如下VHDL类型: type T_SDRAM_REQ is record req : STD_LOGIC; wr : STD_LOGIC; address : STD_LOGIC_VECTOR; wr_data : STD_LOGIC_VECTOR; wr_ben : STD_LOGIC_VECTOR; end record T_SDRAM_REQ; .. vhdl
type T_SDRAM_REQ is record
req : STD_LOGIC;
wr : STD_LOGIC;
address : STD_LOGIC_VECTOR;
wr_data : STD_LOGIC_VECTOR;
wr_ben : STD_LOGIC_VECTOR;
end record T_SDRAM_REQ;
.. vhdl:type:: sdram_pack.T_SDRAM_REQ is record
:members:
并使用类似以下内容的RST指令:
type T_SDRAM_REQ is record
req : STD_LOGIC;
wr : STD_LOGIC;
address : STD_LOGIC_VECTOR;
wr_data : STD_LOGIC_VECTOR;
wr_ben : STD_LOGIC_VECTOR;
end record T_SDRAM_REQ;
.. vhdl:type:: sdram_pack.T_SDRAM_REQ is record
:members:
从源代码中提取所有字段并为我重新设置它们
我已经创建了一个Sphinx域,但我逐渐意识到单靠它是不够的——这只是一堆定制指令而已。我实际上想要的是类似于autoclass或automodule的东西,它扫描Python源文件以生成指令
然而,据我所知,Sphinx automodule功能仅适用于Python。是否可以扩展Sphinx以包含其他语言的类似功能?在VHDL中,可能被称为自动存储或自动实体,在C++中,我猜是AutoMeStEngor还是不同的AutoC类?我是否可以在我的域中添加
vhdl:autopackage::
指令?从Sphinx源代码中可以看出,我不认为automodule指令是Python域的一部分。我自己的问题的答案是:是的。我已经设法做到了,但这并不容易,结果也远远不够完美
虽然Sphinx域API已使用一些通用基类和Python特定的子类进行了设置,但autodoc却不能这样说。一些Python autodoc类可以用作基类,但需要大量重写
我的autodoc系统的组件包括:
- 一个新的指令
,是VHDLAutoDirective
的子类,它为文档管理器和特殊吸引器维护单独的注册表,并从指令名称的开头修剪“vhdl:auto”,而不仅仅是“auto”。喜欢原始调用特定于对象的documenterAutoDirective
- 新的资料员。一个通用的VHDL文档管理器基类
,然后是每个VHDL对象的子类。这些文档编制人员完成所有繁重的工作,从指令中获取选项和内容,并解析VHDL以生成内容。这里的关键问题是Python autodoc依赖于它正在安装的文档化模块。由于Sphinx是用Python编写的,因此很容易VHDLDocumenter
导入那些安装的模块并提取所有必需的信息,例如
可以用于提取doctring。对于任何其他语言,您必须首先找到包含要记录的对象的文件,然后解析它。为了解决第一个问题,我添加了一个\uuuu doc\uuu
指令来为所有后续自动指令指定一个文件,并在我的documenter基类中添加了一个当前文件
选项来允许为每个指令指定文件。这有点笨拙,因为文件的路径是相对于我的存储库的基础的,并且假设Sphinx在那里运行-如果Sphinx在子目录中运行,它将不起作用。对于第二个,我编写了一个基本的标记器和解析器,在考虑将原始源代码复制到文件
指令中可能更好之前,现在我给出了执行这两种操作的选项代码块
- 我的域中的
函数,它在域中注册一个指令,然后导入我的autodoc模块并调用add\u autodocumenter
函数来注册文档管理器。然后,autodoc模块的设置功能使用auto指令对每个对象文档管理器调用add\u documenter
。这与Python autodoc的功能类似,但Python版本将其指令注册到应用程序而不是域add\u autodocumenter
仍有很大的改进空间,但至少它证明了这样做是可能的。是的,内置的autodoc扩展仅适用于Python。但是你所要求的应该是可能的。例如,对于Java,有一个名为javasphinx()的扩展。我不明白为什么类似的东西不能在VHDL中实现。@mzjn感谢您给我指出这一点,但尽管它添加了Java域和apidoc功能,但据我所知,它没有添加autodoc,这正是我所追求的。老实说,我没有Java设置来测试它。相关人员:嗨,安迪,你有你在GitHub或其他地方的工作链接吗?@JosephGlover,恐怕没有。完成工作后不久,我离开了公司,所以我不知道发生了什么事。