This commit is contained in:
zanostro 2025-12-07 11:27:01 +01:00
parent 18a14d204c
commit 717568b6d0
30 changed files with 4093 additions and 209 deletions

View file

@ -0,0 +1,54 @@
cmake_minimum_required(VERSION 3.16)
project(simulator_qt LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
# Prefer Qt6, fall back to Qt5
find_package(Qt6 COMPONENTS Widgets QUIET)
if(NOT Qt6_FOUND)
# Try explicitly the system Qt6 cmake prefix on Debian/Ubuntu
find_package(Qt6 COMPONENTS Widgets QUIET PATHS /usr/lib/x86_64-linux-gnu)
endif()
if(NOT Qt6_FOUND)
# Fallback: try Qt5 if Qt6 is unavailable
find_package(Qt5 COMPONENTS Widgets QUIET)
endif()
if(Qt6_FOUND)
set(QT_LIB Qt6::Widgets)
elseif(Qt5_FOUND)
set(QT_LIB Qt5::Widgets)
else()
message(FATAL_ERROR "Qt6 or Qt5 not found. Install Qt development packages or set CMAKE_PREFIX_PATH to your Qt installation.")
endif()
set(GUI_SRCS
main.cpp
mainwindow.cpp
MachineController.cpp
)
set(GUI_HDRS
mainwindow.h
MachineController.h
)
add_executable(simulator_qt ${GUI_SRCS} ${GUI_HDRS})
# Allow the generated UI headers (from AUTOUIC) to be found in the build dir
# and also include the top-level include folder (works when added with add_subdirectory)
target_include_directories(simulator_qt PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR}/include)
# Link to core library target (must be defined by top-level CMake)
target_link_libraries(simulator_qt PRIVATE simulator_lib ${QT_LIB})
# Place runtime binary under repo/target/bin to match project layout
set_target_properties(simulator_qt PROPERTIES
RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/target/bin
)

View file

@ -0,0 +1,76 @@
#include "MachineController.h"
#include "../../include/machine.h"
#include <chrono>
#include <QDebug>
using namespace std::chrono;
MachineController::MachineController(std::shared_ptr<Machine> machine, QObject *parent)
: QObject(parent), m_machine(std::move(machine))
{
if (!m_machine) {
m_machine = std::make_shared<Machine>();
}
m_lastUpdateTime = steady_clock::now();
}
MachineController::~MachineController() {
stop();
}
void MachineController::start() {
if (m_running.exchange(true)) return;
m_thread = std::thread([this]{ runLoop(); });
}
void MachineController::stop() {
if (!m_running.exchange(false)) return;
if (m_thread.joinable()) m_thread.join();
}
void MachineController::step() {
try {
if (m_machine) {
m_machine->execute();
m_machine->tick();
emit tick();
}
} catch (const std::exception &e) {
emit error(QString::fromStdString(e.what()));
}
}
void MachineController::runLoop() {
const auto minUpdateInterval = milliseconds(16);
while (m_running.load()) {
try {
if (m_machine) {
m_machine->execute();
m_machine->tick();
m_ticksSinceLastUpdate++;
// Throttle GUI updates to 60 Hz
auto now = steady_clock::now();
auto elapsed = duration_cast<milliseconds>(now - m_lastUpdateTime);
if (elapsed >= minUpdateInterval) {
emit tick();
m_lastUpdateTime = now;
m_ticksSinceLastUpdate = 0;
}
if (m_machine->isStopped()) {
emit tick();
m_running.store(false);
break;
}
}
} catch (const std::exception &e) {
emit error(QString::fromStdString(e.what()));
// Stop on fatal error
m_running.store(false);
break;
}
}
}

View file

@ -0,0 +1,34 @@
#ifndef MACHINECONTROLLER_H
#define MACHINECONTROLLER_H
#include <QObject>
#include <atomic>
#include <thread>
#include <memory>
class Machine;
class MachineController : public QObject {
Q_OBJECT
public:
explicit MachineController(std::shared_ptr<Machine> machine = nullptr, QObject *parent = nullptr);
~MachineController() override;
void start();
void stop();
void step();
signals:
void tick();
void error(const QString &msg);
private:
void runLoop();
std::atomic<bool> m_running{false};
std::thread m_thread;
std::shared_ptr<Machine> m_machine;
std::atomic<int> m_ticksSinceLastUpdate{0};
std::chrono::steady_clock::time_point m_lastUpdateTime;
};
#endif // MACHINECONTROLLER_H

View file

@ -0,0 +1,14 @@
#include <QApplication>
#include "mainwindow.h"
#include "../../include/opcode.h"
int main(int argc, char **argv) {
loadInstructionSet();
qputenv("QT_QPA_PLATFORM", "xcb");
QApplication app(argc, argv);
MainWindow w;
w.show();
return app.exec();
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,85 @@
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <memory>
class MachineController;
class Machine;
class QLineEdit;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
std::shared_ptr<Machine> machine() const { return m_machine; }
MachineController* controller() const { return m_controller.get(); }
void startExecution();
void stopExecution();
void stepExecution();
void setTestRegisterValues();
private slots:
void updateRegisterDisplays();
void updateMemoryDisplay();
void updateDisassemblyDisplay();
void onRegisterFieldChanged();
void onMemoryInc256();
void onMemoryInc4096();
void onMemoryInc65536();
void onMemoryDec256();
void onMemoryDec4096();
void onMemoryDec65536();
void onMemoryGoToStart();
void onMemoryGoToEnd();
void onDisassemblyInc();
void onDisassemblyInc16();
void onDisassemblyInc256();
void onDisassemblyDec();
void onDisassemblyDec16();
void onDisassemblyDec256();
void onDisassemblyGoToStart();
void onDisassemblyGoToEnd();
void loadObjectFile();
void showAboutDialog();
void showFrequencyDialog();
private:
Ui::MainWindow *ui;
std::shared_ptr<Machine> m_machine;
std::unique_ptr<MachineController> m_controller;
int m_memoryOffset = 0;
int m_disassemblyOffset = 0;
void connectRegisterFields();
void updateSingleRegisterDisplay(const QString& fieldName, int value);
void updateAllFormatsForRegister(const QString& regPrefix, int value);
void updateFloatRegisterFormats(const QString& regPrefix, double value);
void handleFloatRegisterFieldChanged(QLineEdit* field, const QString& objectName);
void loadDemoProgram();
void setupMemoryDisplay();
void setupDisassemblyDisplay();
struct DisassembledInstruction {
int address;
int size;
QString mnemonic;
QString operand;
int effectiveAddr;
bool isImmediate;
bool isIndirect;
};
DisassembledInstruction disassembleAt(int address);
};
#endif // MAINWINDOW_H

View file

@ -0,0 +1,930 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1172</width>
<height>649</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QWidget" name="widget" native="true">
<property name="geometry">
<rect>
<x>10</x>
<y>0</y>
<width>431</width>
<height>601</height>
</rect>
</property>
<widget class="QGroupBox" name="groupBox">
<property name="geometry">
<rect>
<x>0</x>
<y>80</y>
<width>431</width>
<height>321</height>
</rect>
</property>
<property name="title">
<string>Register values</string>
</property>
<widget class="QLineEdit" name="regA_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>40</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label">
<property name="geometry">
<rect>
<x>10</x>
<y>40</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg A</string>
</property>
</widget>
<widget class="QLineEdit" name="regA_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>40</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regA_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>40</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_2">
<property name="geometry">
<rect>
<x>110</x>
<y>20</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Bin</string>
</property>
</widget>
<widget class="QLabel" name="label_3">
<property name="geometry">
<rect>
<x>230</x>
<y>20</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Hex</string>
</property>
</widget>
<widget class="QLabel" name="label_4">
<property name="geometry">
<rect>
<x>350</x>
<y>20</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Dec</string>
</property>
</widget>
<widget class="QLineEdit" name="regB_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>70</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_5">
<property name="geometry">
<rect>
<x>10</x>
<y>70</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg B</string>
</property>
</widget>
<widget class="QLineEdit" name="regB_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>70</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regB_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>70</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regX_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>100</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_6">
<property name="geometry">
<rect>
<x>10</x>
<y>100</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg X</string>
</property>
</widget>
<widget class="QLineEdit" name="regX_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>100</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regX_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>100</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regS_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>130</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_7">
<property name="geometry">
<rect>
<x>10</x>
<y>130</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg S</string>
</property>
</widget>
<widget class="QLineEdit" name="regS_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>130</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regS_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>130</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regT_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>160</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_8">
<property name="geometry">
<rect>
<x>10</x>
<y>160</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg T</string>
</property>
</widget>
<widget class="QLineEdit" name="regT_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>160</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regT_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>160</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regL_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>190</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regL_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>190</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_9">
<property name="geometry">
<rect>
<x>10</x>
<y>190</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg L</string>
</property>
</widget>
<widget class="QLineEdit" name="regL_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>190</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_10">
<property name="geometry">
<rect>
<x>10</x>
<y>220</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg PC</string>
</property>
</widget>
<widget class="QLineEdit" name="regPC_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>220</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regPC_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>220</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regPC_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>220</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_11">
<property name="geometry">
<rect>
<x>10</x>
<y>249</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg SW</string>
</property>
</widget>
<widget class="QLineEdit" name="regSW_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>249</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regSW_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>249</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regSW_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>249</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLabel" name="label_12">
<property name="geometry">
<rect>
<x>10</x>
<y>280</y>
<width>57</width>
<height>20</height>
</rect>
</property>
<property name="font">
<font>
<pointsize>10</pointsize>
</font>
</property>
<property name="text">
<string>Reg L</string>
</property>
</widget>
<widget class="QLineEdit" name="regF_dec_field">
<property name="geometry">
<rect>
<x>310</x>
<y>280</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regF_bin_field">
<property name="geometry">
<rect>
<x>70</x>
<y>280</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
<widget class="QLineEdit" name="regF_hex_field">
<property name="geometry">
<rect>
<x>190</x>
<y>280</y>
<width>113</width>
<height>23</height>
</rect>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="groupBox_2">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>431</width>
<height>81</height>
</rect>
</property>
<property name="title">
<string>Control</string>
</property>
<widget class="QPushButton" name="StartBtn">
<property name="geometry">
<rect>
<x>30</x>
<y>40</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Start</string>
</property>
</widget>
<widget class="QPushButton" name="StopBtn">
<property name="geometry">
<rect>
<x>170</x>
<y>40</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Stop</string>
</property>
</widget>
<widget class="QPushButton" name="StepBtn">
<property name="geometry">
<rect>
<x>310</x>
<y>40</y>
<width>80</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>Step</string>
</property>
</widget>
</widget>
</widget>
<widget class="QWidget" name="widget_2" native="true">
<property name="geometry">
<rect>
<x>450</x>
<y>0</y>
<width>721</width>
<height>601</height>
</rect>
</property>
<widget class="QGroupBox" name="MemorygroupBox">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>711</width>
<height>291</height>
</rect>
</property>
<property name="title">
<string>Memory</string>
</property>
<widget class="QScrollArea" name="MemoryScrollArea">
<property name="geometry">
<rect>
<x>0</x>
<y>20</y>
<width>711</width>
<height>221</height>
</rect>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>709</width>
<height>219</height>
</rect>
</property>
</widget>
</widget>
<widget class="QPushButton" name="MemoryInc4096Btn">
<property name="geometry">
<rect>
<x>450</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryInc256Btn">
<property name="geometry">
<rect>
<x>370</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryInc65536Btn">
<property name="geometry">
<rect>
<x>530</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;&gt;&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryDec256Btn">
<property name="geometry">
<rect>
<x>290</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryDec4096Btn">
<property name="geometry">
<rect>
<x>210</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&lt;&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryDec65536Btn">
<property name="geometry">
<rect>
<x>130</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>&lt;&lt;&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryGoToStart_2">
<property name="geometry">
<rect>
<x>50</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>O</string>
</property>
</widget>
<widget class="QPushButton" name="MemoryGoToEnd">
<property name="geometry">
<rect>
<x>610</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>|</string>
</property>
</widget>
</widget>
<widget class="QGroupBox" name="MemorygroupBox_3">
<property name="geometry">
<rect>
<x>0</x>
<y>300</y>
<width>711</width>
<height>301</height>
</rect>
</property>
<property name="title">
<string>Disasembly</string>
</property>
<widget class="QScrollArea" name="DisasemblyScrollArea">
<property name="geometry">
<rect>
<x>0</x>
<y>20</y>
<width>711</width>
<height>221</height>
</rect>
</property>
<property name="widgetResizable">
<bool>true</bool>
</property>
<widget class="QWidget" name="scrollAreaWidgetContents_3">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>709</width>
<height>219</height>
</rect>
</property>
</widget>
</widget>
<widget class="QPushButton" name="DisasmInc4096Btn">
<property name="geometry">
<rect>
<x>440</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmInc256Btn">
<property name="geometry">
<rect>
<x>360</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmInc65536Btn">
<property name="geometry">
<rect>
<x>520</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&gt;&gt;&gt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmDec256Btn">
<property name="geometry">
<rect>
<x>280</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmDec4096Btn">
<property name="geometry">
<rect>
<x>200</x>
<y>250</y>
<width>71</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>&lt;&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmDec65536Btn">
<property name="geometry">
<rect>
<x>120</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>&lt;&lt;&lt;</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmGoToStart">
<property name="geometry">
<rect>
<x>40</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>O</string>
</property>
</widget>
<widget class="QPushButton" name="DisasmGoToEnd">
<property name="geometry">
<rect>
<x>600</x>
<y>250</y>
<width>71</width>
<height>21</height>
</rect>
</property>
<property name="text">
<string>|</string>
</property>
</widget>
</widget>
</widget>
</widget>
<widget class="QStatusBar" name="statusbar"/>
<widget class="QToolBar" name="toolBar">
<property name="windowTitle">
<string>toolBar</string>
</property>
<attribute name="toolBarArea">
<enum>TopToolBarArea</enum>
</attribute>
<attribute name="toolBarBreak">
<bool>false</bool>
</attribute>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1172</width>
<height>20</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
<property name="title">
<string>File</string>
</property>
<addaction name="actionLoad_Object_File"/>
</widget>
<widget class="QMenu" name="menuMachine">
<property name="title">
<string>Machine</string>
</property>
<addaction name="actionFrequency"/>
</widget>
<widget class="QMenu" name="menuHelp">
<property name="title">
<string>Help</string>
</property>
<addaction name="actionAbout"/>
</widget>
<addaction name="menuFile"/>
<addaction name="menuMachine"/>
<addaction name="menuHelp"/>
</widget>
<action name="actionLoad_Object_File">
<property name="text">
<string>Load Object File</string>
</property>
</action>
<action name="actionFrequency">
<property name="text">
<string>Frequency</string>
</property>
</action>
<action name="actionAbout">
<property name="text">
<string>About</string>
</property>
</action>
</widget>
<resources/>
<connections/>
</ui>