mirror of
https://github.com/hneemann/Digital.git
synced 2025-09-10 05:15:51 -04:00
fixed a bug in the generation of the documentation
This commit is contained in:
parent
31beebf9ed
commit
d7e918e84a
23
README.md
23
README.md
@ -5,9 +5,9 @@
|
|||||||
|
|
||||||
Digital is a easy-to-use digital logic designer and circuit simulator designed for educational purposes.
|
Digital is a easy-to-use digital logic designer and circuit simulator designed for educational purposes.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Installation ##
|
## Installation ##
|
||||||
|
|
||||||
@ -18,6 +18,13 @@ and on MacOS the JAR file can be started directly.
|
|||||||
A [Java Runtime Environment](https://www.java.com/) (at least JRE 8) is required
|
A [Java Runtime Environment](https://www.java.com/) (at least JRE 8) is required
|
||||||
to run Digital.
|
to run Digital.
|
||||||
|
|
||||||
|
If there are any problems starting Digital on your system, you should try
|
||||||
|
running Digital from a command line:
|
||||||
|
|
||||||
|
```
|
||||||
|
java -jar Digital.jar
|
||||||
|
```
|
||||||
|
|
||||||
## Features ##
|
## Features ##
|
||||||
|
|
||||||
These are the main features of Digital:
|
These are the main features of Digital:
|
||||||
@ -50,11 +57,13 @@ These are the main features of Digital:
|
|||||||
or a [GAL22v10](https://www.microchip.com/wwwproducts/en/ATF22V10C). These chips are somewhat outdated (introduced in 1985!)
|
or a [GAL22v10](https://www.microchip.com/wwwproducts/en/ATF22V10C). These chips are somewhat outdated (introduced in 1985!)
|
||||||
but sufficient for beginners exercises, easy to understand and well documented. Also the
|
but sufficient for beginners exercises, easy to understand and well documented. Also the
|
||||||
[ATF150x](https://www.microchip.com/design-centers/programmable-logic/spld-cpld/cpld-atf15xx-family) chips are
|
[ATF150x](https://www.microchip.com/design-centers/programmable-logic/spld-cpld/cpld-atf15xx-family) chips are
|
||||||
supported which offer up to 128 macro-cells and in system programming. See the documentation for details.
|
supported which offer up to 128 macro-cells and in system programming.
|
||||||
|
See the [documentation](https://github.com/hneemann/Digital/releases/latest) for details.
|
||||||
- SVG export of circuits, including a LaTeX/Inkscape compatible SVG version (see
|
- SVG export of circuits, including a LaTeX/Inkscape compatible SVG version (see
|
||||||
[ctan](https://www.ctan.org/tex-archive/info/svg-inkscape))
|
[ctan](https://www.ctan.org/tex-archive/info/svg-inkscape))
|
||||||
- No legacy code.
|
- No legacy code.
|
||||||
- Good test coverage (about 80%; The GUI tests are not running on the headless Travis-CI build servers, so CodeCov measures only about 50%).
|
- Good test coverage (about 80%; The GUI tests are not running on the headless
|
||||||
|
Travis-CI build servers, so CodeCov measures only about 50%).
|
||||||
Almost all examples contain test cases which ensure that they work correctly.
|
Almost all examples contain test cases which ensure that they work correctly.
|
||||||
|
|
||||||
The latest changes that have not yet been released are listed in the
|
The latest changes that have not yet been released are listed in the
|
||||||
@ -93,7 +102,9 @@ Unfortunately, the development of Toves was discontinued at a very early stage.
|
|||||||
In 2014, Carl Burch finally [discontinued](http://www.cburch.com/logisim/retire-note.html) the development of
|
In 2014, Carl Burch finally [discontinued](http://www.cburch.com/logisim/retire-note.html) the development of
|
||||||
Logisim. Since Logisim was released as open source, there are a number of forks to continue the work on Logisim:
|
Logisim. Since Logisim was released as open source, there are a number of forks to continue the work on Logisim:
|
||||||
|
|
||||||
- [Logisim-Evolution](https://github.com/reds-heig/logisim-evolution) by people of a group of swiss institutes (Haute École Spécialisée Bernoise, Haute École du paysage, d'ingénierie et d'architecture de Genève, and Haute École d'Ingénierie et de Gestion du Canton de Vaud)
|
- [Logisim-Evolution](https://github.com/reds-heig/logisim-evolution) by people of a group of swiss institutes
|
||||||
|
(Haute École Spécialisée Bernoise, Haute École du paysage, d'ingénierie et d'architecture de Genève,
|
||||||
|
and Haute École d'Ingénierie et de Gestion du Canton de Vaud)
|
||||||
- [Logisim](https://github.com/lawrancej/logisim) by Joseph Lawrance at Wentworth Institute of Technology, Boston, MA
|
- [Logisim](https://github.com/lawrancej/logisim) by Joseph Lawrance at Wentworth Institute of Technology, Boston, MA
|
||||||
- [Logisim-iitd](https://code.google.com/archive/p/logisim-iitd/) from the Indian Institute of Technology Delhi
|
- [Logisim-iitd](https://code.google.com/archive/p/logisim-iitd/) from the Indian Institute of Technology Delhi
|
||||||
- [Logisim](http://www.cs.cornell.edu/courses/cs3410/2015sp/) from the CS3410 course of the Cornell University
|
- [Logisim](http://www.cs.cornell.edu/courses/cs3410/2015sp/) from the CS3410 course of the Cornell University
|
||||||
@ -241,4 +252,4 @@ If you want to build Digital from the source code:
|
|||||||
|
|
||||||
## Additional Screenshots
|
## Additional Screenshots
|
||||||
|
|
||||||

|

|
||||||
|
201
README_de.md
201
README_de.md
@ -1,201 +0,0 @@
|
|||||||
[](https://travis-ci.org/hneemann/Digital)
|
|
||||||
|
|
||||||
[Letztes Release herunterladen](https://github.com/hneemann/Digital/releases/latest)
|
|
||||||
|
|
||||||
Die letzten Änderungen sind in den [Release Notes](distribution/ReleaseNotes.txt) zu finden.
|
|
||||||
|
|
||||||
# Digital #
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
Digital ist ein Simulator für digitale Schaltkreise. Er ist für Lehrzwecke entwickelt worden und
|
|
||||||
wird von mir in meinen Vorlesungen eingesetzt.
|
|
||||||
Bevor ich mit der Entwicklung von Digital begonnen habe, habe ich
|
|
||||||
[Logisim](http://www.cburch.com/logisim/) von Carl Burch
|
|
||||||
eingesetzt. Zu erkennen noch daran, dass die Farbschemata der Leitungen sich ähneln.
|
|
||||||
|
|
||||||
Logisim ist ein ganz hervorragendes Werkzeug welches sich beim Einsatz in der Lehre vielfach
|
|
||||||
bewährt hat. Leider hat Carl Burch die Entwicklung von Logisim 2014 eingestellt.
|
|
||||||
Stattdessen hat er 2013 die Entwicklung eines neuen Simulators [Toves](http://www.toves.org/) begonnen.
|
|
||||||
In seinem [Blog](http://www.toves.org/blog/) erklärt er, warum er anstelle einer Weiterentwicklung von Logisim
|
|
||||||
eine Neuentwicklung begonnen hat: Es gibt Schwächen im Design von Logisim, die schwer zu beheben sind.
|
|
||||||
Leider wurde die Entwicklung von Toves sehr früh eingestellt.
|
|
||||||
|
|
||||||
Carl Burch hat jedoch Logisim als Open-Source zur Verfügung gestellt, so dass es eine Reihe von Projekten gibt,
|
|
||||||
welche eine Weiterentwicklung betreiben:
|
|
||||||
|
|
||||||
- [Logisim-Evolution](https://github.com/reds-heig/logisim-evolution) von Mitarbeitern dreier schweizer Institute (Haute École Spécialisée Bernoise, Haute École du paysage, d'ingénierie et d'architecture de Genève, and Haute École d'Ingénierie et de Gestion du Canton de Vaud)
|
|
||||||
- [Logisim](https://github.com/lawrancej/logisim) von Joseph Lawrance vom Wentworth Institute of Technology, Boston, MA
|
|
||||||
- [Logisim-iitd](https://code.google.com/archive/p/logisim-iitd/) vom Indian Institute of Technology Delhi
|
|
||||||
- [Logisim](http://www.cs.cornell.edu/courses/cs3410/2015sp/) des CS3410 Kurses der Cornell Universität
|
|
||||||
|
|
||||||
Aber soweit ich weiß, wird in diesen Projekten nicht daran gearbeitet, die architektonischen Schwächen zu beheben.
|
|
||||||
Es geht eher darum, neue Funktionen zu implementieren und Fehler zu beheben. [Logisim-Evolution](https://github.com/reds-heig/logisim-evolution),
|
|
||||||
wurde zum Beispiel um einen VHDL/Verilog Export erweitert.
|
|
||||||
|
|
||||||
Daher habe ich im März 2016 entschieden einen neuen Simulator von Grund auf neu zu entwickeln.
|
|
||||||
In der Zwischenzeit wurde ein Stand erreicht, der Vergleichbar ist mit Logisim.
|
|
||||||
In einigen Gebieten (Performance, Testen von Schaltungen, Schaltungsanalyse, Hardware-Unterstützung) wurde Logisim übertroffen.
|
|
||||||
|
|
||||||
## Features ##
|
|
||||||
|
|
||||||
Folgende Features zeichnen Digital aus:
|
|
||||||
|
|
||||||
- Messwertegraph zur Anzeige von Signalzuständen.
|
|
||||||
- Gatterschrittmodus zu Analyse von Oszillationen.
|
|
||||||
- Analyse und Synthese von kombinatorischen Schaltungen und Schaltwerken.
|
|
||||||
- Einfaches Testen von Schaltungen: Es können Testfälle erstellt und aussgeführt werden.
|
|
||||||
- Viele Beispiele: Vom Transmission-Gate D-FF bis zum kompletten MIPS-ähnlichem Prozessor.
|
|
||||||
- Enthält eine Bibliothek mit den am häufgsten genutzen Schaltkreisen der 74xx Serie.
|
|
||||||
- Fast-Run-Mode um eine Simulation ohne Aktualisierung des HMI durchzuführen.
|
|
||||||
Ein einfacher Prozessor kann mit 100kHz getaktet werden.
|
|
||||||
- Einfache Remote TCP-Schnittstelle um z.B. mit einer [Assembler-IDE](https://github.com/hneemann/Assembler) den Simulator zu steuern.
|
|
||||||
- Direkter Export von JEDEC Dateien welche in ein [GAL16v8](https://www.microchip.com/wwwproducts/en/ATF16V8C)
|
|
||||||
oder [GAL22v10](https://www.microchip.com/wwwproducts/en/ATF22V10C) geschrieben werden können.
|
|
||||||
Diese Bausteine sind zwar schon sehr alt (vorgestellt 1985!) jedoch sind sie ausreichend für Anfängerübungen,
|
|
||||||
einfach zu verstehen und sehr gut dokumentiert.
|
|
||||||
Zudem werden die Bausteine der [ATF150x](https://www.microchip.com/design-centers/programmable-logic/spld-cpld/cpld-atf15xx-family)
|
|
||||||
Familie unterstützt welche bis zu 128 Makrozellen bieten.
|
|
||||||
- Export zu VHDL: Eine Schaltung kann zu VHDL exportiert werden. Zudem wird das
|
|
||||||
[BASYS3 Board](https://reference.digilentinc.com/reference/programmable-logic/basys-3/start) unterstützt.
|
|
||||||
Details können der Dokumentation entnommen werden.
|
|
||||||
Die Beispiele enthalten eine Variante der einfachen CPU, welche auf dem BASYS3 Board läuft.
|
|
||||||
- SVG-Export von Schaltungen, incl. einer LaTeX-tauglichen SVG-Variante (siehe [ctan](ftp://ftp.fau.de/ctan/info/svg-inkscape/InkscapePDFLaTeX.pdf))
|
|
||||||
- Keine Altlasten im Code
|
|
||||||
- hohe Testabdeckung (exclusiv der GUI-Klassen etwa 80%). Fast alle Beispiele enthalten Testfälle,
|
|
||||||
welche sicherstellen, dass diese korrekt arbeiten.
|
|
||||||
|
|
||||||
## Kommentare ##
|
|
||||||
|
|
||||||
Wenn Sie einen Fehler melden oder einen Verbesserungsvorschlag machen möchten, können Sie die GitHub
|
|
||||||
[Fehlerverfolgung](https://github.com/hneemann/Digital/issues/new) verwenden.
|
|
||||||
Dies hilft mir, Digital zu verbessern, also zögern Sie nicht.
|
|
||||||
|
|
||||||
Alternativ kann auch eine private Nachricht an [digital-simulator@web.de](mailto:digital-simulator@web.de)
|
|
||||||
gesendet werden.
|
|
||||||
|
|
||||||
## Motivation ##
|
|
||||||
|
|
||||||
Im Folgenden möchte ich kurz auf die Punkte eingehen, die mich motiviert haben, eine Neuentwicklung zu
|
|
||||||
starten:
|
|
||||||
|
|
||||||
### Einschalten ###
|
|
||||||
|
|
||||||
In Logisim gibt es kein echtes "Einschalten" einer Schaltung. die Schaltung ist auch aktiv, während sie verändert wird.
|
|
||||||
Dies kann zu unerwartetem Verhalten führen: Ein einfaches Master-Slave JK-Flipflop
|
|
||||||
lässt sich mit Logisim nicht realisieren, da die Schaltung nicht "eingeschaltet" wird, gibt es keine
|
|
||||||
Stabilierungsphase nach dessen Abschluss sich die Schaltung in einem stabilen Zustand befindet.
|
|
||||||
Ein Master-Slave Flipflop lässt sich nur mit einem Reset-Eingang simulieren, und dieser muss auch betätigt werden, um die
|
|
||||||
Schaltung verwenden zu können.
|
|
||||||
|
|
||||||
Um zu verstehen, wie Digital mit diesem Problem umgeht, muss man sich ansehen, wie die Simulation in Digital arbeitet:
|
|
||||||
Digital verwendet einen Ansatz, welcher an einen Event-Based Simulator erinnert. Jedes mal, wenn ein
|
|
||||||
Gatter eine Änderung an einem seiner Eingänge erfährt, werden zwar die Eingänge eingelesen, jedoch
|
|
||||||
werden die Ausgänge des Gatters nicht aktualisiert. Erst wenn alle betroffenen Gatter die Änderungen an
|
|
||||||
ihren Eingängen eingelesen haben, werden die Ausgänge aller Gatter aktualisiert. Alle Gatter scheinen
|
|
||||||
vollkommen synchron umzuschalten. Sie scheinen alle die exakt gleiche Gatterlaufzeit zu haben.
|
|
||||||
Dieser Ansatz führt jedoch dazu, dass sich schon ein einfaches RS-Flipflop unter Umständen nicht stabilisieren kann.
|
|
||||||
Dies ist das selbe Problem welches auch bei Logisim auftritt.
|
|
||||||
|
|
||||||
Um dieses Problem zu lösen, wird während der Einschaltphase wird ein anderer Simulationsmodus verwendet:
|
|
||||||
Alle Gatter lesen ihre Eingänge ein und aktualisieren sofort ihre Ausgänge.
|
|
||||||
Dies geschieht Gatter für Gatter in zufälliger Reihenfolge der Gatter, bis es keine
|
|
||||||
Veränderungen mehr gibt und die Schaltung sich stabilisiert hat.
|
|
||||||
Auf diese Weise stabilisiert sich auch ein Master-Slave Flipflop nach dem "einschalten", jedoch ist der sich einstellende
|
|
||||||
Endzustand nicht definiert.
|
|
||||||
|
|
||||||
Um eine Schaltung in einem definierten Zustand zu Starten gibt es ein spezielles Reset-Gatter.
|
|
||||||
Dieses Gatter hat einen einzigen Ausgang welcher während der Stabilisierungsphase auf Low gehalten wird und
|
|
||||||
auf High wechselt sobald diese abgeschlossen ist.
|
|
||||||
|
|
||||||
Ein Nachteil dieses Vorgehens ist die Tatsache, dass sich in einer laufenden Simulation die Schaltung nicht verändern
|
|
||||||
läst. Diese muss zuerst "ausgeschaltet" werden, und nach der Modifikation ist sie wieder "einzuschalten". Dieses Vorgehen ist
|
|
||||||
jedoch auch bei einer realen Schaltung ratsam.
|
|
||||||
|
|
||||||
### Oszillationen ###
|
|
||||||
|
|
||||||
In Logisim ist es schwer möglich eine oszillierende Schaltung zu untersuchen. Erkennt Logisim eine Oszillation,
|
|
||||||
wird dies zwar angezeigt, es ist aber nicht möglich, die Ursache näher zu untersuchen, bzw. im Detail
|
|
||||||
nachzuvollziehen, wie es zu der Oszillation kommt.
|
|
||||||
|
|
||||||
Die simultane Aktualisierung aller Gatter, welche eine Änderung an einem Ihrer Eingängen erfahren haben, kann auch
|
|
||||||
bei Digital zu einer Oszillation führen. Auch hier wird die Oszillation erkannt, und die Simulation abgebrochen.
|
|
||||||
Es gibt jedoch einen Einzelgattermodus welcher es erlaubt die Propagation einer Signaländerung Gatter für Gatter
|
|
||||||
auf dem Weg durch die Schaltung zu verfolgen. Dabei wird nach jedem Schritt angezeigt, welche Gatter der Schaltung
|
|
||||||
eine Veränderung an einem ihrer Eingänge erfahren haben.
|
|
||||||
Auf diese Weise wird visualisiert, wie sich eine Signaländerung "im Kreis bewegt" und so zu der Oszillation führt.
|
|
||||||
|
|
||||||
### Eingebettete Schaltkreise ###
|
|
||||||
|
|
||||||
Wie bei Logisim können auch mit Digital Schaltkreise in neue Schaltungen eingebettet werden. Auf diese Weise lassen sich
|
|
||||||
hierachische Schaltungen aufbauen. Jedoch werden in Digital Schaltungen, die eingebunden werden tatsächlich so oft
|
|
||||||
in die Schaltung aufgenommen, wie sie importiert werden. Das ist vergleichbar mit einem C-Programm bei welchem alle
|
|
||||||
Funktiosaufrufe per inline eingebunden werden. Es verhällt sich wie bei einer echten Schaltung: Jeder Schaltkreis ist tatsächlich
|
|
||||||
so oft vorhanden, wie er in der Schaltung verwendet wurde. Dieses Vorgehen vergrößert zwar die Datenstrukturen für die Simulation,
|
|
||||||
vereinfacht diese aber zugleich sehr deutlich. So sind z.B. die Ein- und Ausgänge einer eingebetteten Schaltung nicht speziell
|
|
||||||
zu behandeln, sie existieren nach der Modelbildung schlicht nicht mehr. Auch bidirektionelle Anschlüsse stellen somit kein Problem dar.
|
|
||||||
Aus diesem Vorgehen folgt auch, dass sich in Digital z.B. ein UND-Gatter, welches als eigener Schaltkreis eingebettet wurde, genau so
|
|
||||||
verhällt, als wäre es auf oberster Ebene eingefügt worden. Auf Simulationsebene gibt es tatsächlich keinen Unterschied zwischen
|
|
||||||
diesen beiden Varianten.
|
|
||||||
Logisim arbeitet hier etwas anders, was gelegentlich zu Überraschungen führt, z.B. durch unerwartete Signallaufzeiten.
|
|
||||||
|
|
||||||
### Performance ###
|
|
||||||
|
|
||||||
Werden komplette Prozessoren simuliert, ist es möglich die Simulation zu berechnen ohne die grafische Anzeige zu aktualisieren.
|
|
||||||
Ein einfacher Prozessor (siehe Beispiel) lässt sich so mit etwa 100kHz takten (Intel® Core™ i5-3230M CPU @ 2.60GHz) was auch für
|
|
||||||
komplexere Übungen wie z.B. Conway's Game of Live ausreichend ist.
|
|
||||||
Es gibt ein Break-Gatter welches einen einzelnen Eingang hat. Wechselt dieser Eingang von low auf high wird dieser
|
|
||||||
schnelle Lauf beendet. Auf diese Weise lässt sich eine Assembler-Anweisung BRK implementieren, womit sich dann Break-Points
|
|
||||||
in Assembler-Programme einfügen lassen.
|
|
||||||
|
|
||||||
### Debugging ###
|
|
||||||
|
|
||||||
In Logisim gibt es keine einfache Möglichkeit um ein Assembler-Programm in einem simulierten Prozessor zu debuggen.
|
|
||||||
Digital bietet eine einfache TCP-basierte Schnittstelle, so dass eine [assembler IDE](https://github.com/hneemann/Assembler)
|
|
||||||
den Simulator steuern kann. Ein solche IDE kann Anwendungen in den simulierten Prozessor laden, den Prozessor starten und beenden,
|
|
||||||
Einzelschritte ausführen usw..
|
|
||||||
Nach jeder Aktion wird die aktuelle Code-Adresse an die IDE zurückgegeben. Auf diese Weise kann in der IDE der aktuell
|
|
||||||
ausgeführte Befehl hervorgehoben werden. Auf diese Weise kann ein Assembler-Programm sehr einfach analysiert werden.
|
|
||||||
|
|
||||||
### Schaltungssynthese ###
|
|
||||||
|
|
||||||
Logisim kann kombinatorische Schaltungen aus einer Wahrheitstabelle erzeugen und umgekehrt. In Digital ist dies ebenfalls möglich.
|
|
||||||
Zudem lassen sich mit Digital auch Automaten aus einer geeigneten Zustandsübergangstabelle erzeugen. Dabei kann sowohl
|
|
||||||
das Übergangsschaltnetz als auch ein Ausgangsschaltnetz erzeugt werden. Die Minimierung der Ausdrücke erfolgt dabei
|
|
||||||
nach dem Verfahren von Quine und McCluskey. Ebenso lässt sich aus einer Schaltung, die D-Flipflops oder JK-Flipflops
|
|
||||||
enthält die Zustandsübergangstabelle ermitteln. Zu beachten ist jedoch, dass dies nur mit den eingebauten Flipflops funtioniert.
|
|
||||||
Ein FlipFlop welches z.B. aus NOr Gattern aufgebaut wurde, wird nicht als solches erkannt.
|
|
||||||
Die Analyse sequentieller Schaltungen funktioniert nur, wenn rein kombinatorische
|
|
||||||
Schaltungen mit den eingebauten D- oder JK-Flopflops kombiniert werden.
|
|
||||||
Nach der Erzeugung der Wahrheitstabelle kann eine JEDEC-Datei für ein
|
|
||||||
[GAL16v8](http://www.atmel.com/devices/ATF16V8C.aspx) oder ein [GAL22v10](http://www.atmel.com/devices/ATF22V10C.aspx).
|
|
||||||
Danach kann diese Datei in einen entsprechenden Baustein geschrieben werden, um sie in einem realen Aufbau zu testen.
|
|
||||||
Wie erwähnt sind diese Bausteine zwar schon sehr alt, jedoch mit 8 bzw. 10 Makrozellen ausreichend für einfache Übungen.
|
|
||||||
Werden mehr Makro-Zellen benötigt, kann in der PDF Dokumentation nachgelesen werden, wie Digital konfiguriert werden muss,
|
|
||||||
um die Bausteine [ATF1502](http://www.microchip.com/wwwproducts/en/ATF1502AS) und
|
|
||||||
[ATF1504](http://www.microchip.com/wwwproducts/en/ATF1504AS) zu unterstützen, welche 32 bzw. 64 Makrozellen bieten.
|
|
||||||
|
|
||||||
## Wie fange ich an? ##
|
|
||||||
|
|
||||||
Am einfachsten ist es, das [letzte Release](https://github.com/hneemann/Digital/releases/latest) herunter zu laden.
|
|
||||||
In der ZIP-Datei findet sich das Binary (Digital.jar) und alle Beispiele. Ein Java JRE 1.8 wird benötigt, um Digital zu starten.
|
|
||||||
|
|
||||||
Wenn Digital direkt aus dem Source Code gebaut werden soll:
|
|
||||||
|
|
||||||
* Zunächst ist dieses Repository zu clonen.
|
|
||||||
* Ein JDK 1.8 wird benötigt (entweder Oracle JDK 1.8 oder OpenJDK 1.8)
|
|
||||||
* maven wird als Build-System verwendet, daher ist es das einfachste [maven](https://maven.apache.org/) zu installieren.
|
|
||||||
* Danach kann mit `mvn install` Digital gebaut werden.
|
|
||||||
* Mit `mvn site` kann ein findbugs und ein cobertura code coverage report erzeugt werden.
|
|
||||||
* Die meisten IDEs (Eclipse, NetBeans, IntelliJ) könne die Datei `pom.xml` importieren um ein Projekt zu erzeugen.
|
|
||||||
|
|
||||||
## Contribution guidelines ##
|
|
||||||
|
|
||||||
* Wer beitragen möchte kann mir einen pull request schicken.
|
|
||||||
* Bevor ein Pull-Request geschickt wird, sollte mindestens `mvn install` ohne Fehler durchlaufen.
|
|
||||||
* Es sollten keine neuen findbugs Fehler hinzugefügt werden.
|
|
||||||
* Die Testabdeckung sollte noch gehalten werden. Das Ziel ist 80% Testabdeckung in allen nicht GUI Komponenten.
|
|
||||||
* Bis jetzt gibt es nur wenige GUI Tests. Dahier liegt die gesamte Testabdeckung nur bei etwas unter 80%.
|
|
||||||
Versuche den Anteil an ungetestetem GUI-Code so gering wie möglich zu halten.
|
|
Before Width: | Height: | Size: 81 KiB After Width: | Height: | Size: 81 KiB |
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB |
Before Width: | Height: | Size: 91 KiB After Width: | Height: | Size: 91 KiB |
@ -64,7 +64,6 @@ public class ElementTypeDescription {
|
|||||||
public ElementTypeDescription(String name, ElementFactory elementFactory, PinDescription... inputPins) {
|
public ElementTypeDescription(String name, ElementFactory elementFactory, PinDescription... inputPins) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
langKey = "elem_" + name;
|
langKey = "elem_" + name;
|
||||||
this.shortName = Lang.getNull(langKey + "_short");
|
|
||||||
this.elementFactory = elementFactory;
|
this.elementFactory = elementFactory;
|
||||||
this.inputPins = new PinDescriptions(inputPins).setLangKey(getPinLangKey());
|
this.inputPins = new PinDescriptions(inputPins).setLangKey(getPinLangKey());
|
||||||
for (PinDescription p : inputPins)
|
for (PinDescription p : inputPins)
|
||||||
@ -80,9 +79,12 @@ public class ElementTypeDescription {
|
|||||||
* @return the shortname
|
* @return the shortname
|
||||||
*/
|
*/
|
||||||
public String getShortName() {
|
public String getShortName() {
|
||||||
if (shortName == null)
|
if (shortName == null) {
|
||||||
|
String s = Lang.getNull(langKey + "_short");
|
||||||
|
if (s != null)
|
||||||
|
return s;
|
||||||
return getTranslatedName();
|
return getTranslatedName();
|
||||||
else
|
} else
|
||||||
return shortName;
|
return shortName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -7,6 +7,7 @@ package de.neemann.digital.docu;
|
|||||||
|
|
||||||
import de.neemann.digital.core.NodeException;
|
import de.neemann.digital.core.NodeException;
|
||||||
import de.neemann.digital.core.element.*;
|
import de.neemann.digital.core.element.*;
|
||||||
|
import de.neemann.digital.core.memory.Counter;
|
||||||
import de.neemann.digital.draw.elements.PinException;
|
import de.neemann.digital.draw.elements.PinException;
|
||||||
import de.neemann.digital.draw.elements.VisualElement;
|
import de.neemann.digital.draw.elements.VisualElement;
|
||||||
import de.neemann.digital.draw.graphics.GraphicMinMax;
|
import de.neemann.digital.draw.graphics.GraphicMinMax;
|
||||||
@ -32,7 +33,7 @@ import javax.xml.transform.*;
|
|||||||
import javax.xml.transform.sax.SAXResult;
|
import javax.xml.transform.sax.SAXResult;
|
||||||
import javax.xml.transform.stream.StreamSource;
|
import javax.xml.transform.stream.StreamSource;
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
import java.util.ArrayList;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
@ -53,7 +54,7 @@ public class DocuTest extends TestCase {
|
|||||||
w.append("<root titel=\"")
|
w.append("<root titel=\"")
|
||||||
.append(Lang.get("digital"))
|
.append(Lang.get("digital"))
|
||||||
.append("\" titleImage=\"")
|
.append("\" titleImage=\"")
|
||||||
.append(new File(Resources.getRoot(), "../../../screenshot.png").toURI().toString())
|
.append(new File(Resources.getRoot(), "../../../distribution/screenshot.png").toURI().toString())
|
||||||
.append("\" images=\"")
|
.append("\" images=\"")
|
||||||
.append(new File(Resources.getRoot(), "docu/images/").toURI().toString())
|
.append(new File(Resources.getRoot(), "docu/images/").toURI().toString())
|
||||||
.append("\" toc=\"")
|
.append("\" toc=\"")
|
||||||
@ -89,7 +90,7 @@ public class DocuTest extends TestCase {
|
|||||||
w.append(" </settings>\n");
|
w.append(" </settings>\n");
|
||||||
|
|
||||||
ElementLibrary library = new ElementLibrary();
|
ElementLibrary library = new ElementLibrary();
|
||||||
ShapeFactory shapeFactory = new ShapeFactory(library, language.equals("en"));
|
ShapeFactory shapeFactory = new ShapeFactory(library, !language.equals("de"));
|
||||||
String actPath = null;
|
String actPath = null;
|
||||||
for (ElementLibrary.ElementContainer e : library) {
|
for (ElementLibrary.ElementContainer e : library) {
|
||||||
String p = e.getTreePath();
|
String p = e.getTreePath();
|
||||||
@ -198,7 +199,7 @@ public class DocuTest extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
try (Writer w = new OutputStreamWriter(new FileOutputStream(file), "UTF-8")) {
|
try (Writer w = new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)) {
|
||||||
w.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
|
w.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n");
|
||||||
w.append("<icRoot>\n");
|
w.append("<icRoot>\n");
|
||||||
for (Map.Entry<String, String> e : map.entrySet()) {
|
for (Map.Entry<String, String> e : map.entrySet()) {
|
||||||
@ -313,7 +314,7 @@ public class DocuTest extends TestCase {
|
|||||||
final String basename = "Documentation_" + l.getName();
|
final String basename = "Documentation_" + l.getName();
|
||||||
// write xml
|
// write xml
|
||||||
File xml = new File(target, basename + ".xml");
|
File xml = new File(target, basename + ".xml");
|
||||||
try (Writer w = new OutputStreamWriter(new FileOutputStream(xml), "UTF-8")) {
|
try (Writer w = new OutputStreamWriter(new FileOutputStream(xml), StandardCharsets.UTF_8)) {
|
||||||
writeXML(w, images, l.getName(), library);
|
writeXML(w, images, l.getName(), library);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,7 +16,7 @@ import java.nio.charset.StandardCharsets;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks the language files to make sure they a consistent.
|
* Checks the language files to make sure they are consistent.
|
||||||
*/
|
*/
|
||||||
public class TestLang extends TestCase {
|
public class TestLang extends TestCase {
|
||||||
private static final String SOURCEPATH = "/home/hneemann/Dokumente/Java/digital/src/main/java";
|
private static final String SOURCEPATH = "/home/hneemann/Dokumente/Java/digital/src/main/java";
|
||||||
|
@ -420,7 +420,7 @@
|
|||||||
in eine andere eingebettet wird, in manchen Fällen kann es jedoch sinnvoll sein, ein spezielles
|
in eine andere eingebettet wird, in manchen Fällen kann es jedoch sinnvoll sein, ein spezielles
|
||||||
eigenes Symbol für eine Teilschaltung zu verwenden.
|
eigenes Symbol für eine Teilschaltung zu verwenden.
|
||||||
Ein Beispiel ist die Darstellung der ALU in dem Prozessor, welcher in den Beispielen enthalten ist.
|
Ein Beispiel ist die Darstellung der ALU in dem Prozessor, welcher in den Beispielen enthalten ist.
|
||||||
In diesem Kapitel wird erklärt, wie eine solches spezielles Symbol für eine Schaltung definiert wird.
|
In diesem Kapitel wird beschrieben, wie eine solches spezielles Symbol für eine Schaltung definiert wird.
|
||||||
</par>
|
</par>
|
||||||
<par>
|
<par>
|
||||||
Digital bietet keinen Editor für das Erstellen eines speziellen Symbols an. Statt dessen ist ein kleiner
|
Digital bietet keinen Editor für das Erstellen eines speziellen Symbols an. Statt dessen ist ein kleiner
|
||||||
|
Loading…
x
Reference in New Issue
Block a user