From ad6ca84f6e93f983de926ae71f31f42325986f61 Mon Sep 17 00:00:00 2001 From: manuel Date: Thu, 14 May 2009 18:15:28 +0200 Subject: * making cdisplay a template * adding some asserts * adding classdiagramm and protokoll * fixing protokoll.pdf in ue1 --- ue3/protokoll/mycpu.png | Bin 0 -> 111899 bytes ue3/protokoll/mycpu.vpp | Bin 0 -> 129025 bytes ue3/protokoll/protokoll.tex | 144 +++++++++++++++++++++++++++++++++++++++----- 3 files changed, 129 insertions(+), 15 deletions(-) create mode 100644 ue3/protokoll/mycpu.png create mode 100644 ue3/protokoll/mycpu.vpp (limited to 'ue3/protokoll') diff --git a/ue3/protokoll/mycpu.png b/ue3/protokoll/mycpu.png new file mode 100644 index 0000000..570d50a Binary files /dev/null and b/ue3/protokoll/mycpu.png differ diff --git a/ue3/protokoll/mycpu.vpp b/ue3/protokoll/mycpu.vpp new file mode 100644 index 0000000..1f4b264 Binary files /dev/null and b/ue3/protokoll/mycpu.vpp differ diff --git a/ue3/protokoll/protokoll.tex b/ue3/protokoll/protokoll.tex index 8b413e7..dd53735 100644 --- a/ue3/protokoll/protokoll.tex +++ b/ue3/protokoll/protokoll.tex @@ -38,44 +38,110 @@ Manuel Mausz, \matrnr 0728348\\ Abbildung~\ref{fig:classdiagram1} zeigt das Klassendiagramm der Aufgabe. -TODO +Als Datentyp für Register und Hauptspeicher der CPU wurde ein allgemeines +Template implementiert, welche andere Datentypen oder Klasse umhüllen kann. +Zudem wurden die gängigsten Operatoren definiert, die man sich von einem +Datentyp erwarten kann. Gemäß der Aufgabenstellung wurde der Datentyp CDat als +umhüllter Integer-Wert definiert. + +Der Hauptspeicher der CPU wurde als abgeleitetes Template \mbox{CVectorMem} des +Templates \mbox{std::vector} implementiert, damit dieses um die +Methode \mbox{initialize} und \mbox{dump} erweitert werden konnten. Erstere +dient zur Initialisierung des Hauptspeichers bzw. Füllung des Vectors, +zweiteres zur Debugausgabe. Der Datentyp CMem wurde via typedef als +\mbox{CVectorMem} mit dem Templateargument CDat definiert. Somit enthält der +Hauptspeicher nur Elemente des Typs CDat. + +Die geforderten zwei Display-Klassen \mbox{CDisplayWDEZ} und +\mbox{CDisplayWHEX} wurden von der abstrakten Klasse CDisplay abgeleitet, welche +selbst als Template CDisplayT mit dem Templateargument CDat definiert ist. + +Der Programmspeicher \mbox{CProgram} wurde vom Template +\mbox{std::vector} abgeleitet. Somit ist diese Klasse, ähnlich +wie CMem, selbst ein Vector. Zudem wurden weitere Methoden hinzugefügt. Die +Methode \mbox{compile} dient zum Kompilieren bzw. Umwandeln des +Syntax der Programmdatei in Instanzen der Klasse CInstruction, die später von +der CPU ausgeführt werden. Zur Umwandlung werden bei der Instantiierung von +\mbox{CProgram} sämtliche erlaubten Instruktionen (also Instanzen von +\mbox{CInstruction}) in ein \mbox{std::set} eingefügt. Im Zuge der Methode +\mbox{compile} wird durch Iterieren die jeweilige Instruktion gesucht und durch +Anwendung des Designpattern \textit{Factory method pattern} die Instruktion +dupliziert und in \mbox{CProgram} gespeichert. Labels werden zwecks Effizienz in +einer \mbox{std::map} festgehalten. + +Die jeweiligen unterstützen Instruktionen wurden wie gefordert von der Klasse +\mbox{CInstruction} abgeleitet. \mbox{CInstruction} fordert die +Implementierung einer Methode \mbox{compile}, die während des parsens der +Programmdatei von \mbox{CProgram} aufgerufen werden, als auch eine Methode +\mbox{execute}, die im Zuge der Ausführung des Programms von CCPU +aufgerufen werden. + +Die eigentliche CPU wird durch die Klasse \mbox{CCPU} implementiert. Diese +dient hauptsächlich als Container für die einzelnen, notwendigen Teile +(Hauptspeicher, Programmspeicher, Displays, ...) und besitzt daher entsprechend +viele get- und set-Funktionen. Die Methode \mbox{run} dient zur Ausführung des +Programms und ist eine Schleife, die über die Instruktionen iteriert und die +Methode \mbox{execute} aufruft. %================================================================== -\begin{figure}[htb] - \begin{center} - \epsfxsize=0.9\textwidth\epsfbox{mycpu.png} - \end{center} - \caption{Klassendiagramm 1} - \label{fig:classdiagram1} -\end{figure} +\begin{center} + \begin{figure}[htb] + \epsfxsize=1.6\textwidth\epsfbox{mycpu.png} + \caption{Klassendiagramm 1} + \label{fig:classdiagram1} + \end{figure} +\end{center} %================================================================== \subsection{Verwaltung der Ressourcen} -TODO +Alle Objekte, die im Konstruktor alloziert werden, werden im Destruktor wieder +freigegeben. Die Objekte, die über die \textit{Factory method pattern} +alloziert werden, werden im Zuge des Destruktor des Vectors bzw. +von \mbox{CProgram} wieder freigegeben. \subsection{Fehlerbehandlung} -TODO +Es wurden keine eigenen Exceptions eingeführt. Statt dessen werden Exceptions +meist in Exceptions des Typs \mbox{std::runtime\_error} umgewandelt. Da die +Hierarchie nicht sehr tief ist, fängt lediglich \mbox{CPropram::compile} +Exceptions des Typs \mbox{std::runtime\_error}, um zusätzliche Information an +den ursprünglichen Aufrufer der Methode weiterzugeben. Dies geschieht ebenfalls +per Exception des Typs \mbox{std::runtime\_error}. \subsection{Implementierung} -TODO - +Siehe Punkt~\ref{Design} und Abbildung~\ref{fig:classdiagram1} sowie +Punkt~\ref{Listings}.\\ +Es wurde viel mit Templates gearbeitet. \section{Projektverlauf} \subsection{Probleme und Fallstricke} -TODO +Abgesehen von den mittlerweile üblichen Schwierigkeiten die Angabe bzw. +die Gedanken dessen Verfassers verstehen zu wollen, arbeitete das erste Design +noch vermehrt mit Text. Unter anderem hatte die Methode +\mbox{CInstruction::execute} einen Parameter des Typs \mbox{std::string}, was +zum dazu führte, das die Instruktion bei jeder Aufführung (zum Beispiel durch +Jumps) erneut geparsed werden musste. \subsection{Arbeitsaufwand} \begin{tabular}{ll} \toprule - Entwicklungsschritt / Meilenstein & Arbeitsaufwand in Stunden\\ + Entwicklungsschritt / Meilenstein & Arbeitsaufwand\\ + \midrule + Erstes Design & 3 Stunden\\ + \hline + Implementierung & 3 Tage\\ + \hline + Anpassung des Designs und der Implementierung & 4 Stunden\\ + \hline + Dokumentation (Doxygen) und Überprüfung aller\\ + Anforderungen gemäß der Programmierrichtlinien & 4 Stunden\\ \hline - TODO & TODO\\ + Erstellung des Protokolls & 3 Stunden\\ \bottomrule \end{tabular} @@ -88,5 +154,53 @@ TODO \subsection{mycpu.cpp} \lstinputlisting{../mycpu/mycpu.cpp} +\newpage +\subsection{cdat.h} +\lstinputlisting{../mycpu/cdat.h} + +\newpage +\subsection{cmem.h} +\lstinputlisting{../mycpu/cmem.h} + +\newpage +\subsection{cinstruction.h} +\lstinputlisting{../mycpu/cinstruction.h} + +\newpage +\subsection{cinstruction.cpp} +\lstinputlisting{../mycpu/cinstruction.cpp} + +\newpage +\subsection{instructions.h} +\lstinputlisting{../mycpu/instructions.h} + +\newpage +\subsection{instructions.cpp} +\lstinputlisting{../mycpu/instructions.cpp} + +\newpage +\subsection{cdisplay.h} +\lstinputlisting{../mycpu/cdisplay.h} + +\newpage +\subsection{displays.h} +\lstinputlisting{../mycpu/displays.h} + +\newpage +\subsection{cprogram.h} +\lstinputlisting{../mycpu/cprogram.h} + +\newpage +\subsection{cprogram.cpp} +\lstinputlisting{../mycpu/cprogram.cpp} + +\newpage +\subsection{ccpu.h} +\lstinputlisting{../mycpu/ccpu.h} + +\newpage +\subsection{ccpu.cpp} +\lstinputlisting{../mycpu/ccpu.cpp} + \end{document} -- cgit v1.2.3