diff options
Diffstat (limited to 'qtmips_gui')
| -rw-r--r-- | qtmips_gui/CacheContent.ui | 22 | ||||
| -rw-r--r-- | qtmips_gui/CacheStatistics.ui | 10 | ||||
| -rw-r--r-- | qtmips_gui/MainWindow.ui | 99 | ||||
| -rw-r--r-- | qtmips_gui/NewDialog.ui | 344 | ||||
| -rw-r--r-- | qtmips_gui/cachecontent.cpp | 10 | ||||
| -rw-r--r-- | qtmips_gui/cachecontent.h | 17 | ||||
| -rw-r--r-- | qtmips_gui/cachestatistics.cpp | 8 | ||||
| -rw-r--r-- | qtmips_gui/cachestatistics.h | 15 | ||||
| -rw-r--r-- | qtmips_gui/coreview.cpp | 33 | ||||
| -rw-r--r-- | qtmips_gui/coreview.h | 43 | ||||
| -rw-r--r-- | qtmips_gui/icons.qrc | 16 | ||||
| -rw-r--r-- | qtmips_gui/icons/application-exit.png | bin | 2633 -> 2525 bytes | |||
| -rw-r--r-- | qtmips_gui/main.cpp | 15 | ||||
| -rw-r--r-- | qtmips_gui/mainwindow.cpp | 93 | ||||
| -rw-r--r-- | qtmips_gui/mainwindow.h | 44 | ||||
| -rw-r--r-- | qtmips_gui/newdialog.cpp | 153 | ||||
| -rw-r--r-- | qtmips_gui/newdialog.h | 33 | ||||
| -rw-r--r-- | qtmips_gui/qtmips_gui.pro | 23 | ||||
| -rw-r--r-- | qtmips_gui/registersdock.cpp | 10 | ||||
| -rw-r--r-- | qtmips_gui/registersdock.h | 18 | ||||
| -rw-r--r-- | qtmips_gui/registersdock.ui | 18 | 
21 files changed, 885 insertions, 139 deletions
| diff --git a/qtmips_gui/CacheContent.ui b/qtmips_gui/CacheContent.ui index ac2f263..372dee1 100644 --- a/qtmips_gui/CacheContent.ui +++ b/qtmips_gui/CacheContent.ui @@ -1,7 +1,7 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?>  <ui version="4.0"> - <class>DockWidget</class> - <widget class="QDockWidget" name="DockWidget"> + <class>CacheContent</class> + <widget class="QDockWidget" name="CacheContent">    <property name="geometry">     <rect>      <x>0</x> @@ -11,8 +11,20 @@     </rect>    </property>    <property name="windowTitle"> -   <string>DockWidget</string> +   <string>Cache content</string>    </property> -  <widget class="QWidget" name="dockWidgetContents"/> +  <widget class="QWidget" name="dockWidgetContents"> +   <layout class="QVBoxLayout" name="verticalLayout"> +    <item> +     <widget class="QLabel" name="label"> +      <property name="text"> +       <string>TODO</string> +      </property> +     </widget> +    </item> +   </layout> +  </widget>   </widget> + <resources/> + <connections/>  </ui> diff --git a/qtmips_gui/CacheStatistics.ui b/qtmips_gui/CacheStatistics.ui index ac2f263..5bb8b72 100644 --- a/qtmips_gui/CacheStatistics.ui +++ b/qtmips_gui/CacheStatistics.ui @@ -1,7 +1,7 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?>  <ui version="4.0"> - <class>DockWidget</class> - <widget class="QDockWidget" name="DockWidget"> + <class>CacheStatistics</class> + <widget class="QDockWidget" name="CacheStatistics">    <property name="geometry">     <rect>      <x>0</x> @@ -11,8 +11,10 @@     </rect>    </property>    <property name="windowTitle"> -   <string>DockWidget</string> +   <string>Cache statistics</string>    </property>    <widget class="QWidget" name="dockWidgetContents"/>   </widget> + <resources/> + <connections/>  </ui> diff --git a/qtmips_gui/MainWindow.ui b/qtmips_gui/MainWindow.ui index 0f69613..56f5319 100644 --- a/qtmips_gui/MainWindow.ui +++ b/qtmips_gui/MainWindow.ui @@ -6,20 +6,47 @@     <rect>      <x>0</x>      <y>0</y> -    <width>400</width> -    <height>300</height> +    <width>957</width> +    <height>651</height>     </rect>    </property>    <property name="windowTitle">     <string>MainWindow</string>    </property> -  <widget class="QWidget" name="centralWidget"/> +  <property name="dockNestingEnabled"> +   <bool>false</bool> +  </property> +  <property name="unifiedTitleAndToolBarOnMac"> +   <bool>true</bool> +  </property> +  <widget class="QWidget" name="centralWidget"> +   <layout class="QHBoxLayout" name="horizontalLayout"> +    <property name="spacing"> +     <number>0</number> +    </property> +    <property name="leftMargin"> +     <number>0</number> +    </property> +    <property name="topMargin"> +     <number>0</number> +    </property> +    <property name="rightMargin"> +     <number>0</number> +    </property> +    <property name="bottomMargin"> +     <number>0</number> +    </property> +    <item> +     <widget class="QWidget" name="widget" native="true"/> +    </item> +   </layout> +  </widget>    <widget class="QMenuBar" name="menuBar">     <property name="geometry">      <rect>       <x>0</x>       <y>0</y> -     <width>400</width> +     <width>957</width>       <height>20</height>      </rect>     </property> @@ -27,7 +54,8 @@      <property name="title">       <string>File</string>      </property> -    <addaction name="actionLoad_binary"/> +    <addaction name="actionNew"/> +    <addaction name="actionReload"/>      <addaction name="separator"/>      <addaction name="actionExit"/>     </widget> @@ -85,16 +113,39 @@     <attribute name="toolBarBreak">      <bool>false</bool>     </attribute> +   <addaction name="actionNew"/> +   <addaction name="actionReload"/> +   <addaction name="separator"/> +   <addaction name="actionRun"/> +   <addaction name="actionPause"/> +   <addaction name="actionStep"/>    </widget> -  <action name="actionLoad_binary"> +  <action name="actionNew"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/document-import.png</normaloff>:/icons/document-import.png</iconset> +   </property>     <property name="text"> -    <string>Load binary...</string> +    <string>New simulation...</string> +   </property> +   <property name="shortcut"> +    <string>Ctrl+O, Ctrl+N</string>     </property>    </action>    <action name="actionExit"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/application-exit.png</normaloff>:/icons/application-exit.png</iconset> +   </property>     <property name="text">      <string>Exit</string>     </property> +   <property name="toolTip"> +    <string>Exit program</string> +   </property> +   <property name="shortcut"> +    <string>Ctrl+Q</string> +   </property>    </action>    <action name="actionRestart">     <property name="text"> @@ -102,19 +153,40 @@     </property>    </action>    <action name="actionRun"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/play.png</normaloff>:/icons/play.png</iconset> +   </property>     <property name="text">      <string>Run</string>     </property> +   <property name="shortcut"> +    <string>Ctrl+R</string> +   </property>    </action>    <action name="actionStep"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/next.png</normaloff>:/icons/next.png</iconset> +   </property>     <property name="text">      <string>Step</string>     </property> +   <property name="shortcut"> +    <string>Ctrl+S</string> +   </property>    </action>    <action name="actionPause"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/pause.png</normaloff>:/icons/pause.png</iconset> +   </property>     <property name="text">      <string>Pause</string>     </property> +   <property name="shortcut"> +    <string>Ctrl+P</string> +   </property>    </action>    <action name="action1_ips">     <property name="text"> @@ -184,8 +256,19 @@      <string>Assembler</string>     </property>    </action> +  <action name="actionReload"> +   <property name="icon"> +    <iconset resource="icons.qrc"> +     <normaloff>:/icons/reload.png</normaloff>:/icons/reload.png</iconset> +   </property> +   <property name="text"> +    <string>Reload existing</string> +   </property> +  </action>   </widget>   <layoutdefault spacing="6" margin="11"/> - <resources/> + <resources> +  <include location="icons.qrc"/> + </resources>   <connections/>  </ui> diff --git a/qtmips_gui/NewDialog.ui b/qtmips_gui/NewDialog.ui index 18d31ab..e39edbf 100644 --- a/qtmips_gui/NewDialog.ui +++ b/qtmips_gui/NewDialog.ui @@ -1,71 +1,299 @@ -<ui version="4.0" > - <author></author> - <comment></comment> - <exportmacro></exportmacro> - <class>Dialog</class> - <widget class="QDialog" name="Dialog" > -  <property name="geometry" > +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>NewDialog</class> + <widget class="QDialog" name="NewDialog"> +  <property name="geometry">     <rect>      <x>0</x>      <y>0</y> -    <width>400</width> -    <height>300</height> +    <width>558</width> +    <height>306</height>     </rect>    </property> -  <property name="windowTitle" > +  <property name="windowTitle">     <string>Dialog</string>    </property> -  <widget class="QDialogButtonBox" name="buttonBox" > -   <property name="geometry" > -    <rect> -     <x>30</x> -     <y>240</y> -     <width>341</width> -     <height>32</height> -    </rect> +  <property name="modal"> +   <bool>true</bool> +  </property> +  <layout class="QVBoxLayout" name="verticalLayout"> +   <property name="leftMargin"> +    <number>0</number>     </property> -   <property name="orientation" > -    <enum>Qt::Horizontal</enum> +   <property name="topMargin"> +    <number>0</number>     </property> -   <property name="standardButtons" > -    <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> +   <property name="rightMargin"> +    <number>0</number>     </property> -  </widget> +   <item> +    <widget class="QTabWidget" name="tabWidget"> +     <property name="currentIndex"> +      <number>2</number> +     </property> +     <widget class="QWidget" name="tab"> +      <attribute name="title"> +       <string>Basic</string> +      </attribute> +      <layout class="QVBoxLayout" name="verticalLayout_5"> +       <item> +        <widget class="QGroupBox" name="groupBox_2"> +         <property name="title"> +          <string>Preset</string> +         </property> +         <layout class="QVBoxLayout" name="verticalLayout_6"> +          <item> +           <widget class="QRadioButton" name="preset_no_pipeline"> +            <property name="text"> +             <string>No pipeline no cache</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QRadioButton" name="preset_pipelined"> +            <property name="text"> +             <string>Pipelined and cache</string> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QRadioButton" name="preset_custom"> +            <property name="text"> +             <string>Custom</string> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item> +        <spacer name="verticalSpacer_3"> +         <property name="orientation"> +          <enum>Qt::Vertical</enum> +         </property> +         <property name="sizeHint" stdset="0"> +          <size> +           <width>20</width> +           <height>40</height> +          </size> +         </property> +        </spacer> +       </item> +       <item> +        <widget class="Line" name="line_2"> +         <property name="orientation"> +          <enum>Qt::Horizontal</enum> +         </property> +        </widget> +       </item> +       <item> +        <layout class="QHBoxLayout" name="horizontalLayout_3"> +         <item> +          <widget class="QLabel" name="label"> +           <property name="text"> +            <string>Elf executable: </string> +           </property> +          </widget> +         </item> +         <item> +          <widget class="QLineEdit" name="elf_file"/> +         </item> +         <item> +          <widget class="QPushButton" name="pushButton_browse"> +           <property name="text"> +            <string>Browse</string> +           </property> +          </widget> +         </item> +        </layout> +       </item> +      </layout> +     </widget> +     <widget class="QWidget" name="tab_core"> +      <attribute name="title"> +       <string>Core</string> +      </attribute> +      <layout class="QVBoxLayout" name="verticalLayout_2"> +       <property name="sizeConstraint"> +        <enum>QLayout::SetDefaultConstraint</enum> +       </property> +       <item> +        <widget class="QCheckBox" name="pipelined"> +         <property name="text"> +          <string>Pipelined</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QCheckBox" name="hazard"> +         <property name="text"> +          <string>Hazard unit</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QCheckBox" name="flush_jump"> +         <property name="text"> +          <string>Flush pipeline on jump</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QGroupBox" name="prediction"> +         <property name="title"> +          <string>Jump prediction</string> +         </property> +         <property name="flat"> +          <bool>false</bool> +         </property> +         <property name="checkable"> +          <bool>true</bool> +         </property> +         <property name="checked"> +          <bool>false</bool> +         </property> +         <layout class="QVBoxLayout" name="verticalLayout_3"> +          <item> +           <widget class="QRadioButton" name="prediction_static"> +            <property name="text"> +             <string>Static</string> +            </property> +            <property name="checked"> +             <bool>true</bool> +            </property> +           </widget> +          </item> +          <item> +           <widget class="QRadioButton" name="prediction_one_dynamic"> +            <property name="text"> +             <string>One level dynamic</string> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item> +        <spacer name="verticalSpacer"> +         <property name="orientation"> +          <enum>Qt::Vertical</enum> +         </property> +         <property name="sizeHint" stdset="0"> +          <size> +           <width>20</width> +           <height>40</height> +          </size> +         </property> +        </spacer> +       </item> +      </layout> +     </widget> +     <widget class="QWidget" name="tab_memory"> +      <attribute name="title"> +       <string>Memory</string> +      </attribute> +      <layout class="QVBoxLayout" name="verticalLayout_4"> +       <item> +        <widget class="QCheckBox" name="mem_protec_write"> +         <property name="text"> +          <string>Program memory write protection</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QCheckBox" name="mem_protec_exec"> +         <property name="text"> +          <string>Data memory executable protection</string> +         </property> +        </widget> +       </item> +       <item> +        <widget class="QGroupBox" name="cache"> +         <property name="title"> +          <string>Cache (for both program and data)</string> +         </property> +         <property name="checkable"> +          <bool>true</bool> +         </property> +         <property name="checked"> +          <bool>false</bool> +         </property> +         <layout class="QVBoxLayout" name="verticalLayout_7"> +          <item> +           <widget class="QRadioButton" name="cache_associative"> +            <property name="text"> +             <string>Associative</string> +            </property> +            <property name="checked"> +             <bool>true</bool> +            </property> +           </widget> +          </item> +         </layout> +        </widget> +       </item> +       <item> +        <spacer name="verticalSpacer_2"> +         <property name="orientation"> +          <enum>Qt::Vertical</enum> +         </property> +         <property name="sizeHint" stdset="0"> +          <size> +           <width>20</width> +           <height>40</height> +          </size> +         </property> +        </spacer> +       </item> +      </layout> +     </widget> +    </widget> +   </item> +   <item> +    <layout class="QHBoxLayout" name="horizontalLayout_2"> +     <property name="leftMargin"> +      <number>9</number> +     </property> +     <property name="topMargin"> +      <number>0</number> +     </property> +     <property name="rightMargin"> +      <number>9</number> +     </property> +     <property name="bottomMargin"> +      <number>0</number> +     </property> +     <item> +      <spacer name="horizontalSpacer"> +       <property name="orientation"> +        <enum>Qt::Horizontal</enum> +       </property> +       <property name="sizeHint" stdset="0"> +        <size> +         <width>40</width> +         <height>20</height> +        </size> +       </property> +      </spacer> +     </item> +     <item> +      <widget class="QPushButton" name="pushButton_load"> +       <property name="text"> +        <string>Load machine</string> +       </property> +      </widget> +     </item> +     <item> +      <widget class="QPushButton" name="pushButton_cancel"> +       <property name="text"> +        <string>Cancel</string> +       </property> +      </widget> +     </item> +    </layout> +   </item> +  </layout>   </widget> - <pixmapfunction></pixmapfunction>   <resources/> - <connections> -  <connection> -   <sender>buttonBox</sender> -   <signal>accepted()</signal> -   <receiver>Dialog</receiver> -   <slot>accept()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>248</x> -     <y>254</y> -    </hint> -    <hint type="destinationlabel" > -     <x>157</x> -     <y>274</y> -    </hint> -   </hints> -  </connection> -  <connection> -   <sender>buttonBox</sender> -   <signal>rejected()</signal> -   <receiver>Dialog</receiver> -   <slot>reject()</slot> -   <hints> -    <hint type="sourcelabel" > -     <x>316</x> -     <y>260</y> -    </hint> -    <hint type="destinationlabel" > -     <x>286</x> -     <y>274</y> -    </hint> -   </hints> -  </connection> - </connections> + <connections/>  </ui> diff --git a/qtmips_gui/cachecontent.cpp b/qtmips_gui/cachecontent.cpp index c651b7b..1dd4693 100644 --- a/qtmips_gui/cachecontent.cpp +++ b/qtmips_gui/cachecontent.cpp @@ -1,6 +1,10 @@ -#include "cache_content.h" +#include "cachecontent.h" -cache_content::cache_content() -{ +CacheContentDock::CacheContentDock(QWidget *parent) : QDockWidget(parent) { +    ui = new Ui::CacheContent(); +    ui->setupUi(this); +} +CacheContentDock::~CacheContentDock() { +    delete ui;  } diff --git a/qtmips_gui/cachecontent.h b/qtmips_gui/cachecontent.h index 09b8734..3b028b5 100644 --- a/qtmips_gui/cachecontent.h +++ b/qtmips_gui/cachecontent.h @@ -1,11 +1,16 @@ -#ifndef CACHE_CONTENT_H -#define CACHE_CONTENT_H +#ifndef CACHECONTENT_H +#define CACHECONTENT_H +#include <QDockWidget> +#include "ui_CacheContent.h" -class cache_content -{ +class CacheContentDock : public QDockWidget {  public: -    cache_content(); +    CacheContentDock(QWidget *parent); +    ~CacheContentDock(); + +private: +    Ui::CacheContent *ui;  }; -#endif // CACHE_CONTENT_H
\ No newline at end of file +#endif // CACHECONTENT_H diff --git a/qtmips_gui/cachestatistics.cpp b/qtmips_gui/cachestatistics.cpp index ade92c6..dd78a8c 100644 --- a/qtmips_gui/cachestatistics.cpp +++ b/qtmips_gui/cachestatistics.cpp @@ -1,6 +1,10 @@  #include "cachestatistics.h" -CacheStatistics::CacheStatistics() -{ +CacheStatisticsDock::CacheStatisticsDock(QWidget *parent) : QDockWidget(parent) { +    ui = new Ui::CacheStatistics(); +    ui->setupUi(this); +} +CacheStatisticsDock::~CacheStatisticsDock() { +    delete ui;  } diff --git a/qtmips_gui/cachestatistics.h b/qtmips_gui/cachestatistics.h index 4fa77a6..a92d125 100644 --- a/qtmips_gui/cachestatistics.h +++ b/qtmips_gui/cachestatistics.h @@ -1,11 +1,18 @@  #ifndef CACHESTATISTICS_H  #define CACHESTATISTICS_H +#include <QDockWidget> +#include "ui_CacheStatistics.h" -class CacheStatistics -{ +class CacheStatisticsDock : public QDockWidget { +    Q_OBJECT  public: -    CacheStatistics(); +    CacheStatisticsDock(QWidget *parent); +    ~CacheStatisticsDock(); + +private: +    Ui::CacheStatistics *ui; +  }; -#endif // CACHESTATISTICS_H
\ No newline at end of file +#endif // CACHESTATISTICS_H diff --git a/qtmips_gui/coreview.cpp b/qtmips_gui/coreview.cpp index de8a637..4d23bd8 100644 --- a/qtmips_gui/coreview.cpp +++ b/qtmips_gui/coreview.cpp @@ -1,6 +1,35 @@  #include "coreview.h" -CoreView::CoreView() -{ +CoreView::CoreView(QWidget *parent) : QGraphicsView(parent) {  } + +/* +CoreViewBlock::CoreViewBlock() { +} + +CoreViewLine::CoreViewLine() { + +} + +CoreViewLine::CoreViewLine(struct point start, struct point end, QList<struct point> axis) { + +} + +CoreViewLine::~CoreViewLine() { + +} + +void CoreViewLine::set_start(struct point p) { + +} + +void CoreViewLine::set_end(struct point p) { + +} + +void CoreViewLine::set_axis(QList<struct point> axs) { + +} + +*/ diff --git a/qtmips_gui/coreview.h b/qtmips_gui/coreview.h index 6e7407f..a2772fb 100644 --- a/qtmips_gui/coreview.h +++ b/qtmips_gui/coreview.h @@ -1,11 +1,46 @@  #ifndef COREVIEW_H  #define COREVIEW_H +#include <QGraphicsView> +#include <QGraphicsItem> +#include <QList> +#include "machineconfig.h" -class CoreView -{ +class CoreView : public QGraphicsView { +    Q_OBJECT  public: -    CoreView(); +    CoreView(QWidget *parent); + +private: + +}; + +/* +class CoreViewBlock : public QGraphicsItem { +    Q_OBJECT +public: +    CoreViewBlock(); +}; + +class CoreViewLine : public QGraphicsItem { +    Q_OBJECT +public: +    struct point { +        int x1, y1, x2, y2; +    }; + +    CoreViewLine(); +    CoreViewLine(struct point start, struct point end, QList<struct point> axis); +    ~CoreViewLine(); + +    void set_start(struct point); +    void set_end(struct point); +    void set_axis(QList<struct point>); + +protected: +    struct point start, end; +    QList<struct point> axis;  }; +*/ -#endif // COREVIEW_H
\ No newline at end of file +#endif // COREVIEW_H diff --git a/qtmips_gui/icons.qrc b/qtmips_gui/icons.qrc index 90f4a83..08542ee 100644 --- a/qtmips_gui/icons.qrc +++ b/qtmips_gui/icons.qrc @@ -1,2 +1,14 @@ -<!DOCTYPE RCC> -<RCC version="1.0"/> +<RCC> +    <qresource prefix="/"> +        <file>icons/application-exit.png</file> +        <file>icons/reload.png</file> +        <file>icons/document-import.png</file> +        <file>icons/finish.png</file> +        <file>icons/forward.png</file> +        <file>icons/next.png</file> +        <file>icons/pause.png</file> +        <file>icons/refresh.png</file> +        <file>icons/play.png</file> +        <file>icons/stop.png</file> +    </qresource> +</RCC> diff --git a/qtmips_gui/icons/application-exit.png b/qtmips_gui/icons/application-exit.pngBinary files differ index 2d0cd61..79ee79c 100644 --- a/qtmips_gui/icons/application-exit.png +++ b/qtmips_gui/icons/application-exit.png diff --git a/qtmips_gui/main.cpp b/qtmips_gui/main.cpp index b48f94e..1c03f3f 100644 --- a/qtmips_gui/main.cpp +++ b/qtmips_gui/main.cpp @@ -1,11 +1,14 @@ -#include "mainwindow.h"  #include <QApplication> +#include <QCommandLineParser> +#include "mainwindow.h" + +int main(int argc, char *argv[]) { +    QApplication app(argc, argv); +    app.setApplicationName("qtmips_gui"); +    app.setApplicationVersion("0.1"); -int main(int argc, char *argv[]) -{ -    QApplication a(argc, argv);      MainWindow w; -    w.show(); +    w.start(); -    return a.exec(); +    return app.exec();  } diff --git a/qtmips_gui/mainwindow.cpp b/qtmips_gui/mainwindow.cpp index 49d64fc..ea48736 100644 --- a/qtmips_gui/mainwindow.cpp +++ b/qtmips_gui/mainwindow.cpp @@ -1,14 +1,93 @@  #include "mainwindow.h" -#include "ui_mainwindow.h" -MainWindow::MainWindow(QWidget *parent) : -    QMainWindow(parent), -    ui(new Ui::MainWindow) -{ +MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { +    settings = new QSettings("CTU", "QtMips"); +    coreview  = nullptr; + +    ui = new Ui::MainWindow();      ui->setupUi(this); +    setWindowTitle("QtMips"); + +    // Create/prepare other widgets +    ndialog = new NewDialog(this, settings); +    cache_content = new CacheContentDock(this); +    cache_content->hide(); +    cache_statictics = new CacheStatisticsDock(this); +    cache_statictics->hide(); +    registers = new RegistersDock(this); +    registers->hide(); + +    // Connect signals from menu +    QObject::connect(ui->actionExit, SIGNAL(triggered(bool)), this, SLOT(close())); +    QObject::connect(ui->actionNew, SIGNAL(triggered(bool)), this, SLOT(new_machine())); +    QObject::connect(ui->actionCache, SIGNAL(triggered(bool)), this, SLOT(show_cache_content())); +    QObject::connect(ui->actionCache_statistics, SIGNAL(triggered(bool)), this, SLOT(show_cache_statictics())); +    QObject::connect(ui->actionRegisters, SIGNAL(triggered(bool)), this, SLOT(show_registers())); + +    // Restore application state from settings +    restoreState(settings->value("windowState").toByteArray()); +    restoreGeometry(settings->value("windowGeometry").toByteArray());  } -MainWindow::~MainWindow() -{ +MainWindow::~MainWindow() { +    settings->sync(); +    delete settings; +    if (coreview != nullptr) +        delete coreview; +    delete ndialog; +    delete cache_content; +    delete cache_statictics; +    delete registers;      delete ui;  } + +void MainWindow::start() { +    this->show(); +    ndialog->show(); +} + +void MainWindow::create_core(MachineConfig *config) { +    // Create machine +    machine = new QtMipsMachine(config); +    // Create machine view +    coreview = new CoreView(this); +    this->setCentralWidget(coreview); +    // TODO connect signals +} + +void MainWindow::new_machine() { +    ndialog->show(); +} + +void MainWindow::show_cache_content() { +    show_dockwidget(cache_content); +} + +void MainWindow::show_cache_statictics() { +    show_dockwidget(cache_statictics); +} + +void MainWindow::show_registers() { +    show_dockwidget(registers); +} + +bool MainWindow::configured() { +    return (machine != nullptr); +} + +void MainWindow::closeEvent(QCloseEvent *event) { +    settings->setValue("windowGeometry", saveGeometry()); +    settings->setValue("windowState", saveState()); +    settings->sync(); +    QMainWindow::closeEvent(event); +} + +void MainWindow::show_dockwidget(QDockWidget *dw) { +    if (dw->isHidden()) { +        dw->show(); +        addDockWidget(Qt::RightDockWidgetArea, dw); +    } else { +        dw->raise(); +        dw->setFocus(); +    } +} diff --git a/qtmips_gui/mainwindow.h b/qtmips_gui/mainwindow.h index a3948a9..bba1cb7 100644 --- a/qtmips_gui/mainwindow.h +++ b/qtmips_gui/mainwindow.h @@ -2,21 +2,55 @@  #define MAINWINDOW_H  #include <QMainWindow> +#include <QSettings> +#include "ui_MainWindow.h" +#include "newdialog.h" +#include "coreview.h" +#include "cachecontent.h" +#include "cachestatistics.h" +#include "registersdock.h" -namespace Ui { -class MainWindow; -} +#include "qtmipsmachine.h" +#include "machineconfig.h" -class MainWindow : public QMainWindow -{ +class MainWindow : public QMainWindow {      Q_OBJECT  public:      explicit MainWindow(QWidget *parent = 0);      ~MainWindow(); +    void start(); +    void create_core(MachineConfig *config); + +public slots: +    void new_machine(); + +    void show_cache_content(); +    void show_cache_statictics(); +    void show_registers(); + +    bool configured(); + +protected: +    void closeEvent(QCloseEvent *event); +  private:      Ui::MainWindow *ui; + +    NewDialog *ndialog; + +    CoreView *coreview; + +    CacheContentDock *cache_content; +    CacheStatisticsDock *cache_statictics; +    RegistersDock *registers; + +    QSettings  *settings; + +    QtMipsMachine *machine; // Current simulated machine + +    void show_dockwidget(QDockWidget *w);  };  #endif // MAINWINDOW_H diff --git a/qtmips_gui/newdialog.cpp b/qtmips_gui/newdialog.cpp index b2d24a8..31f4bb8 100644 --- a/qtmips_gui/newdialog.cpp +++ b/qtmips_gui/newdialog.cpp @@ -1,6 +1,155 @@  #include "newdialog.h" +#include "mainwindow.h" -newdialog::newdialog() -{ +NewDialog::NewDialog(QWidget *parent, QSettings *settings) : QDialog(parent) { +    ui = new Ui::NewDialog(); +    ui->setupUi(this); +    setWindowTitle("New machine"); +    this->settings = settings; + +    QObject::connect(ui->pushButton_load, SIGNAL(clicked(bool)), this, SLOT(create())); +    QObject::connect(ui->pushButton_cancel, SIGNAL(clicked(bool)), this, SLOT(cancel())); +    // Signals on Base tab +    QObject::connect(ui->preset_no_pipeline, SIGNAL(toggled(bool)), this, SLOT(preset(bool))); +    QObject::connect(ui->preset_pipelined, SIGNAL(toggled(bool)), this, SLOT(preset(bool))); +    QObject::connect(ui->pushButton_browse, SIGNAL(clicked(bool)), this, SLOT(browse_elf())); +#define CUSTOM_PRESET(UI)  QObject::connect(UI, SIGNAL(clicked(bool)), this, SLOT(set_custom_preset())) +    // Signals on Core tab +    CUSTOM_PRESET(ui->pipelined); +    CUSTOM_PRESET(ui->hazard); +    CUSTOM_PRESET(ui->flush_jump); +    CUSTOM_PRESET(ui->prediction); +    CUSTOM_PRESET(ui->prediction_static); +    CUSTOM_PRESET(ui->prediction_one_dynamic); +    // Signals on Memory tab +    CUSTOM_PRESET(ui->mem_protec_write); +    CUSTOM_PRESET(ui->mem_protec_exec); +    CUSTOM_PRESET(ui->cache); +    CUSTOM_PRESET(ui->cache_associative); +#undef CUSTOM_PRESET + +    // Load setting after signals are configured so that we can have correct settings +    load_settings(); +} + +NewDialog::~NewDialog() { +    delete ui; +    // Settings is freed by parent +    delete elf_dialog; +} + +void NewDialog::cancel() { +    this->close(); +} + +void NewDialog::create() { +    MainWindow *prnt = (MainWindow*)parent(); + +    MachineConfig *mc = new MachineConfig(); +    mc->set_elf(ui->elf_file->text()); +    mc->set_pipelined(ui->pipelined->isChecked()); +    // TODO other settings + +    try { +        prnt->create_core(mc); +    } catch (const QtMipsExceptionInput &e) { +        QMessageBox msg(this); +        msg.setText(e.msg(false)); +        msg.setIcon(QMessageBox::Critical); +        msg.setToolTip("Please check that ELF executable realy exists and is in correct format."); +        msg.setDetailedText(e.msg(true)); +        msg.setWindowTitle("Error while initializing new machine"); +        msg.exec(); +        goto cleanup; +    } + +    store_settings(); // Save to settings +    this->close(); + +cleanup: +    delete mc; +} + +void NewDialog::browse_elf() { +    QFileDialog elf_dialog(this); +    elf_dialog.setFileMode(QFileDialog::ExistingFile); +    if (elf_dialog.exec()) +        ui->elf_file->setText(elf_dialog.selectedFiles()[0]); +} + +void NewDialog::preset(bool value) { +    if (value) { +        bool pip = ui->preset_pipelined->isChecked(); +        // Core settings +        ui->pipelined->setChecked(pip); +        ui->hazard->setChecked(pip); +        ui->flush_jump->setChecked(pip); +        ui->prediction->setChecked(pip); +        ui->prediction_one_dynamic->setChecked(pip); +        // Memory settings +        ui->mem_protec_write->setChecked(true); +        ui->mem_protec_exec->setChecked(true); +        ui->cache->setChecked(pip); +        ui->cache_associative->setChecked(true); +    } // Else custom so do no changes +} + +void NewDialog::set_custom_preset() { +    ui->preset_custom->setChecked(true); +} + +void NewDialog::closeEvent(QCloseEvent *) { +    load_settings(); // Reset from settings +    // Close main window if not already configured +    MainWindow *prnt = (MainWindow*)parent(); +    if (!prnt->configured()) +        prnt->close(); +} + +#define LOAD_BUTTON(NAME, DEF) ui->NAME->setChecked(settings->value(#NAME, DEF).toBool()) +#define LOAD_LINE(NAME, DEF) ui->NAME->setText(settings->value(#NAME, DEF).toString()) + +#define STORE_BUTTON(NAME) settings->setValue(#NAME, ui->NAME->isChecked()) +#define STORE_LINE(NAME) settings->setValue(#NAME, ui->NAME->text()) + +void NewDialog::load_settings() { +    // Core tab +    LOAD_BUTTON(pipelined, false); +    LOAD_BUTTON(hazard, false); +    LOAD_BUTTON(flush_jump, false); +    LOAD_BUTTON(prediction, false); +    LOAD_BUTTON(prediction_static, true); +    LOAD_BUTTON(prediction_one_dynamic, false); +    // Memory tab +    LOAD_BUTTON(mem_protec_write, true); +    LOAD_BUTTON(mem_protec_exec, true); +    LOAD_BUTTON(cache, false); +    LOAD_BUTTON(cache_associative, true); +    // Base tab +    // We are doing this last so presets can reset previous configuration to somethin valid +    LOAD_BUTTON(preset_no_pipeline, true); +    LOAD_BUTTON(preset_pipelined, false); +    LOAD_BUTTON(preset_custom, false); +    LOAD_LINE(elf_file, ""); +} + +void NewDialog::store_settings() { +    // Core tab +    STORE_BUTTON(pipelined); +    STORE_BUTTON(hazard); +    STORE_BUTTON(flush_jump); +    STORE_BUTTON(prediction); +    STORE_BUTTON(prediction_static); +    STORE_BUTTON(prediction_one_dynamic); +    // Memory tab +    STORE_BUTTON(mem_protec_write); +    STORE_BUTTON(mem_protec_exec); +    STORE_BUTTON(cache); +    STORE_BUTTON(cache_associative); +    // Base tab +    STORE_BUTTON(preset_no_pipeline); +    STORE_BUTTON(preset_pipelined); +    STORE_BUTTON(preset_custom); +    STORE_LINE(elf_file);  } diff --git a/qtmips_gui/newdialog.h b/qtmips_gui/newdialog.h index d37c9c0..d9e850e 100644 --- a/qtmips_gui/newdialog.h +++ b/qtmips_gui/newdialog.h @@ -1,11 +1,36 @@  #ifndef NEWDIALOG_H  #define NEWDIALOG_H +#include <QDialog> +#include <QSettings> +#include <QFileDialog> +#include <QMessageBox> +#include "ui_NewDialog.h" +#include "qtmipsexception.h" -class newdialog -{ +class NewDialog : public QDialog { +    Q_OBJECT  public: -    newdialog(); +    NewDialog(QWidget *parent, QSettings *settings); +    ~NewDialog(); + +public slots: +    void cancel(); +    void create(); +    void browse_elf(); +    void preset(bool); +    void set_custom_preset(); + +protected: +    void closeEvent(QCloseEvent *); + +private: +    Ui::NewDialog *ui; +    QSettings *settings; +    QFileDialog *elf_dialog; + +    void load_settings(); +    void store_settings();  }; -#endif // NEWDIALOG_H
\ No newline at end of file +#endif // NEWDIALOG_H diff --git a/qtmips_gui/qtmips_gui.pro b/qtmips_gui/qtmips_gui.pro index 7dfb53c..ee2bd6e 100644 --- a/qtmips_gui/qtmips_gui.pro +++ b/qtmips_gui/qtmips_gui.pro @@ -14,10 +14,27 @@ DEFINES += QT_DEPRECATED_WARNINGS  SOURCES += \          main.cpp \ -        mainwindow.cpp +        mainwindow.cpp \ +        newdialog.cpp \ +        coreview.cpp \ +        registersdock.cpp \ +        cachestatistics.cpp \ +        cachecontent.cpp  HEADERS += \ -        mainwindow.h +        mainwindow.h \ +        newdialog.h \ +        coreview.h \ +        registersdock.h \ +        cachestatistics.h \ +        cachecontent.h  FORMS += \ -        mainwindow.ui +        NewDialog.ui \ +        MainWindow.ui \ +        CacheContent.ui \ +        registersdock.ui \ +        CacheStatistics.ui + +RESOURCES += \ +        icons.qrc diff --git a/qtmips_gui/registersdock.cpp b/qtmips_gui/registersdock.cpp index bf82725..e8a5907 100644 --- a/qtmips_gui/registersdock.cpp +++ b/qtmips_gui/registersdock.cpp @@ -1,6 +1,10 @@ -#include "registers.h" +#include "registersdock.h" -Registers::Registers() -{ +RegistersDock::RegistersDock(QWidget *parent) : QDockWidget(parent) { +    ui = new Ui::RegistersDock(); +    ui->setupUi(this); +} +RegistersDock::~RegistersDock() { +    delete ui;  } diff --git a/qtmips_gui/registersdock.h b/qtmips_gui/registersdock.h index 0fb60eb..338edc3 100644 --- a/qtmips_gui/registersdock.h +++ b/qtmips_gui/registersdock.h @@ -1,11 +1,17 @@ -#ifndef REGISTERS_H -#define REGISTERS_H +#ifndef REGISTERSDOCK_H +#define REGISTERSDOCK_H +#include <QDockWidget> +#include "ui_registersdock.h" -class Registers -{ +class RegistersDock : public QDockWidget {  public: -    Registers(); +    RegistersDock(QWidget *parent); +    ~RegistersDock(); + +private: +    Ui::RegistersDock *ui; +  }; -#endif // REGISTERS_H
\ No newline at end of file +#endif // REGISTERSDOCK_H diff --git a/qtmips_gui/registersdock.ui b/qtmips_gui/registersdock.ui index ac2f263..9b51505 100644 --- a/qtmips_gui/registersdock.ui +++ b/qtmips_gui/registersdock.ui @@ -1,7 +1,7 @@ -<?xml version="1.0"?> +<?xml version="1.0" encoding="UTF-8"?>  <ui version="4.0"> - <class>DockWidget</class> - <widget class="QDockWidget" name="DockWidget"> + <class>RegistersDock</class> + <widget class="QDockWidget" name="RegistersDock">    <property name="geometry">     <rect>      <x>0</x> @@ -11,8 +11,16 @@     </rect>    </property>    <property name="windowTitle"> -   <string>DockWidget</string> +   <string>Registers</string>    </property> -  <widget class="QWidget" name="dockWidgetContents"/> +  <widget class="QWidget" name="dockWidgetContents"> +   <layout class="QVBoxLayout" name="verticalLayout"> +    <item> +     <widget class="QTableWidget" name="tableWidget"/> +    </item> +   </layout> +  </widget>   </widget> + <resources/> + <connections/>  </ui> | 
