gem5 GUI
概述
背景和动机
gem5 的当前状态需要开发 Python 脚本来定义和生成不同的体系结构。这可能很繁琐,因为用户流程可能导致较少的视觉思考。我们希望有一个工具具有更好的用户流程,允许开发人员以视觉方式创建和调整这些模型,就像 Chisel 一样。为了使 gem5 更容易访问并允许新用户利用其所有功能,我们创建了一个用户界面,将允许这种易用性和功能性。
描述
我们开发了一个用户界面,允许用户在左侧目录中搜索 SimObject,将它们放置在画布上,并移动它们以创建可以实例化和模拟的体系结构层次结构。选择对象允许用户在左下角的属性表中修改参数。将对象放置在另一个对象内会建立父子关系。使用连线工具绘制连线允许对象之间的端口连接。
方法
下面的图像是我们对 GUI 基本结构的初始图表,以及与我们的”后端”(在这种情况下是 gem5 仓库)交互的高级概述。我们的 GUI 具有不同的前端和后端,它们通过 State 类和 SymObject 类链接。
技术规格
我们决定仅使用 Python 开发 GUI。因此,自然的选择是使用 QT 的 Python 绑定,这是最流行的 GUI 开发库之一。我们选择 PySide2 而不是 PyQt5,因为我们需要商业许可证才能在 PyQt5 下发布代码。
安装和设置
1. 先决条件
gem5 需要 Linux 操作系统才能运行,因此 GUI 不支持跨平台开发。您还需要在机器上安装已编译的 gem5。访问 gem5 下载 以获取如何设置 gem5 的说明。
2. 基本设置
要开始设置过程,请将仓库直接克隆到 gem5 目录中。完成后,进入 gem5_GUI 目录并使用以下命令下载依赖项:
pip3 install -r requirements.txt
3. 运行应用程序
安装依赖项后,用户可以使用以下命令运行 GUI:
<gem5.opt path> gui.py
有关设置和运行问题的帮助,请参阅仓库中的 README.md 文件。
功能和特性
GUI 概述
下面附上成功启动时 GUI 的视图:
左侧是目录视图和属性视图。
前者用于选择 SimObject,后者用于配置选定的 SimObject。屏幕的大部分由画布填充。这是大多数用户交互发生的地方,也是用户构建系统的地方。菜单栏包含 GUI 软件典型的多个便利功能,从复制粘贴到文件保存,但还有用于调试、运行和导入的选项卡。这些是 GUI 的关键功能,与 gem5 协同工作,为用户提供检查系统配置、导入 UI 对象和配置的子类以及实例化其系统的能力。顶部菜单下方是一个按钮,允许用户在对象之间绘制端口。
目录视图
目录包含所有可用的 SimObject。用户可以通过特定类别操作树视图,或在顶部搜索栏中搜索对象。双击对象会在画布上放置我们称为 SymObject 的对象。这是 m5 SimObject 的 GUI 表示,允许用户以触觉方式与之交互。
属性表
选择对象会显示其属性表。此表列出对象名称、每个子对象以及所有对象参数。参数字段是可修改的,而”Name”和”Child Objects”字段仅可查看。将鼠标悬停在参数名称上会显示参数的描述,将鼠标悬停在值上会显示类型。除了始终位于表顶部的”Name”和”Child Objects”参数外,还可以搜索特定对象的属性。
连线
要启用连线绘制,请单击菜单和目录之间的连线图标。在连线绘制模式下,无法与对象交互。单击此按钮会将光标更改为十字准线,允许用户用连线连接端口。未能连接两个端口或连接不兼容的端口将导致错误消息。右键单击连线会显示上下文菜单,允许删除和检查(打印有关端连接的信息)。
上下文
理解 gem5 GUI 的一个重要部分是用户上下文的工作方式。每当创建或选择对象时,它被设置为当前选定的 SymObject。选定的对象通常以绿色突出显示,除非有需要用户设置的必需属性;然后,对象为红色。每当选择对象时,用户可以自由移动它并在画布中调整其大小,其属性会填充在属性表中。最后,重要的是要注意连线_不_依赖于当前上下文,因此任何对象的任何端口都可以连接到其他端口,无论它们是否在上下文中。
菜单概述
菜单包含与 GUI 交互的工具。其中大多数对应于不言自明的标准窗口功能,菜单中的所有选项都对应于键盘快捷键。
运行
运行选项卡包含实例化和模拟选项。请注意,在用户至少放置一个根对象之前,它是灰色的,以防止用户在无根的情况下实例化。按下实例化按钮后,用户_必须_保存文件(因为对象一旦实例化就无法修改),之后实例化的结果将显示在命令行上。执行实例化后,用户可以与模拟按钮交互,这将在命令行上再次显示输出。
调试
通过按工具栏上的调试按钮,调试窗口将出现在 GUI 的右侧。将有两个复选框:”Log to File”和”Log to Stdout”,前者自动设置。记录到文件会将调试和错误消息发送到文件,可以在下面的文本中随时重命名。记录到 stdout 将在运行 GUI 的终端应用程序中打印这些消息。这些选项下方是一个充满 gem5 系统原生调试标志的表。可以设置和取消设置这些标志,并导致与设置的标志相关的 gem5 调试消息。它们也可以通过随附的搜索栏进行搜索。
导入和导出 UI 对象
在文件下,我们有导入和导出 UI 对象,允许用户保存和加载 SymObject 集群。导出将配置保存为 .obj 文件,该文件具有 JSON 格式。导入将自定义对象放置在目录中,允许与常规 SimObject 相同的访问方法。
导入 SimObject
用户可以导入自定义 SimObject,这些是从基础 SimObject 继承的 Python 类。这些导入出现在目录下,可以像常规对象一样添加到 GUI。导入的 SimObject 保存为 .ui 文件的一部分,因此在打开包含导入 SimObject 的 .ui 文件时不需要再次导入。
未来
在开发时间线上,我们遇到了障碍并提出了新想法,因此我们无法完成最初计划的所有工作。未来的开发可以解决这些功能以及其他可能需要的功能:
- 导出为多种文件格式(当前实例化生成 config.json)
- 模拟结果的可视化,与其他模拟的比较
- 参数化对象以允许并行运行多个模拟并比较结果/识别最佳参数值
尽管我们尽最大努力解决在开发和用户测试中遇到的错误,但事实是,像这样的 GUI 这样对用户限制很少的沙盒应用程序会通过不可预见的用法产生大量错误。如果您遇到错误,请通过打开问题、提交拉取请求或直接联系我们或 gem5 团队告知我们。请尝试记录导致故障的步骤,并包括终端的屏幕截图。