Vhdl 是否可以将Sphinx automodule扩展到Python以外的域?

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

我希望使用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:: 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
    ,是
    AutoDirective
    的子类,它为文档管理器和特殊吸引器维护单独的注册表,并从指令名称的开头修剪“vhdl:auto”,而不仅仅是“auto”。喜欢原始调用特定于对象的documenter
  • 新的资料员。一个通用的VHDL文档管理器基类
    VHDLDocumenter
    ,然后是每个VHDL对象的子类。这些文档编制人员完成所有繁重的工作,从指令中获取选项和内容,并解析VHDL以生成内容。这里的关键问题是Python autodoc依赖于它正在安装的文档化模块。由于Sphinx是用Python编写的,因此很容易
    导入那些安装的模块并提取所有必需的信息,例如
    \uuuu doc\uuu
    可以用于提取doctring。对于任何其他语言,您必须首先找到包含要记录的对象的文件,然后解析它。为了解决第一个问题,我添加了一个
    当前文件
    指令来为所有后续自动指令指定一个文件,并在我的documenter基类中添加了一个
    文件
    选项来允许为每个指令指定文件。这有点笨拙,因为文件的路径是相对于我的存储库的基础的,并且假设Sphinx在那里运行-如果Sphinx在子目录中运行,它将不起作用。对于第二个,我编写了一个基本的标记器和解析器,在考虑将原始源代码复制到
    代码块
    指令中可能更好之前,现在我给出了执行这两种操作的选项
  • 我的域中的
    add\u autodocumenter
    函数,它在域中注册一个指令,然后导入我的autodoc模块并调用
    add\u documenter
    函数来注册文档管理器。然后,autodoc模块的设置功能使用auto指令对每个对象文档管理器调用
    add\u autodocumenter
    。这与Python autodoc的功能类似,但Python版本将其指令注册到应用程序而不是域

仍有很大的改进空间,但至少它证明了这样做是可能的。

是的,内置的autodoc扩展仅适用于Python。但是你所要求的应该是可能的。例如,对于Java,有一个名为javasphinx()的扩展。我不明白为什么类似的东西不能在VHDL中实现。@mzjn感谢您给我指出这一点,但尽管它添加了Java域和apidoc功能,但据我所知,它没有添加autodoc,这正是我所追求的。老实说,我没有Java设置来测试它。相关人员:嗨,安迪,你有你在GitHub或其他地方的工作链接吗?@JosephGlover,恐怕没有。完成工作后不久,我离开了公司,所以我不知道发生了什么事。