C :: Aufgabe #138
0 Lösungen
Spice Netlist, rationale Zahlen
Fortgeschrittener - C
von zefcat
- 15.12.2016 um 16:26 Uhr
Einleitung:
Bei dieser Aufgabe wird eine vereinfachte SPICE netlist verwendet um ein elektrisches Netz zu berechnen.
Um die Aufgabe einfach und übersichtlich zu halten beschränken sich die Netzwerke auf Serienschaltungen und passive Bauteile (R, L, C).
Es wird besonderer Wert auf eine korrekte Fehlerbehandlung gelegt.
Programmaufruf
Das Programm wird mit folgenden Parametern aufgerufen (wobei die Argumente inklusive der Klammern mit entsprechenden Werten zu ersetzen sind):
netlist_filename: Pfad zur netlist-Datei welche geparsed und verarbeitet werden soll. (Inputdatei)
omega: Ganzzahlige Angabe der Berechnung '2*PI*f' bei welcher die Impedanz berechnet werden soll.
Ein korrekter Programmaufruf könnte so aussehen:
Rationale Zahlen
Um die Berechnungen durchführbar zu machen ist es wichtig Rationale Zahlen darstellen zu können. In dieser Übung soll die Darstellung
(ZÄHLER/NENNER) verwendet werden.
Bei der Rechnung mit diesen Bruchzahlen oder einer Ausgabe gilt es diese so weit wie möglich zu kürzen.
Auch alle Zwischenergebnisse von Berechnungen sind so weit wie möglich zu kürzen.
Eine 0 soll als (0/1) dargestellt werden.
Berechnung:
Um unsere Impedanz zu berechnen brauchen wir die Blindwiderstände von Spulen und Kondensatoren.
Spule:
Kondensator:
SPICE Netlist
Wir verwenden eine stark vereinfachte Version von netlist. Wie bereits in der Einleitung erwähnt sollen nur in Serie geschaltete RLC-Elemete möglich sein.
Die Zeilen in der Netlist haben folgendes Format:
BAUTEILNAME KNOTEN_A KNOTEN_B WERT
Zwischen den Bereichen (also zum Beispiel zwischen KNOTEN_A und KNOTEN_B) in der Zeile steht mindestens ein Leerzeichen. Wobei der BAUTEILNAME nur mit R,L,C beginnen darf und eine nachfolgende Nummer (ganzzahlig max. 5 Stellen) enthält. Zusätzlich darf es der Einfachheit halber zwischen zwei Knoten nur ein Bauteil geben (Serienschaltung). Der WERT besteht immer aus einer Bruchzahl.
Die Knoten sind immer als ganze Zahlen angegeben, der erste Knoten hat immer die Nummer 0. Die Knoten existieren immer aufeinander folgend, d.h. es kann kein Bauteil geben welches zwischen z.B. Knoten 2 und 4 liegt. Zur Einfachheit müssen nur maximal 20 aufeinander folgende Knoten unterstützt werden, d.h es kann nur Knoten Nummern von 0 bis 19 geben.
Es soll auch möglich sein Kommentare zu verarbeiten:
Kommentare dürfen nur alleine in einer Zeile stehen, das erste Zeichen ist ein *.
Leere Zeilen in der Netlist sollen ebenso wie Kommentare von der Verarbeitung übersprungen werden.
Beispiel einer Netlist:
Bei diesem Beispiel ist der Widerstand R1 mit dem Kondensator C0 und der Induktivität L1 in dieser Reihenfolge in Serie geschaltet. Die Elemente müssen eine durchgehende Verbindung bilden. Die Zeilen in der netlist-Datei müssen nicht zwingend in dieser Reihenfolge sein, daher muss vom Programm eine entsprechende Sortierung durchgeführt werden.
Leerzeichen vor Kommentarzeilen und vor und am Ende von Bauteilzeilen können beliebig behandelt werden. Als Zeilenumbruch soll sowohl \n als auch \r\n möglich sein.
Die Brüche in der netlist können auch noch zu kürzen sein.
Eine leere Netzliste ist zwar gültig der Nutzer wird jedoch keine Berechnungen durchführen können.
Es ist ungültig einen Wert mit dem Nenner von 0 anzugeben.
Bauteilnamen dürfen nur einmalig vergeben werden. Dies ist vom Programm zu überprüfen.
Der maximale Wert der in der Netzliste angegeben werden darf ist (UINT_MAX/UINT_MAX).
Bauteile dürfen auch mit 0 bewertet werden, jedoch nicht negativ.
Eine Zeile in der Netlist ist maximal 128 Zeichen lang.
Ausgabe:
Um das Programm leichter überprüfen zu können soll nach dem Ausführen die Netzliste sortiert und gekürzt ausgegeben werden.
zum Beispiel (mit oben beschriebener netlist):
Eine Zeile hat hier die Form:
Nach dieser Ausgabe soll eine Eingabe für den Nutzer bereitgestellt werden. Diese beginnt mit
Hierbei ist das Leerzeichen nach
Eingabe:
Der Nutzer soll nun die Möglichkeit haben sich die Impedanz zwischen 2 Knoten anzeigen zu lassen.
Die Reihenfolge der Angabe spielt hierbei keine Rolle.
Mit der oben Angegeben Netzliste und dieser Ausgabe soll nun
ausgegeben werden. Die Ausgabe soll immer Real- und Imaginärteil beinhalten auch wenn einer von diesen 0 ist.
Sollte eine Fehlerhafte Eingabe erfolgen soll
ausgegeben werden. Als Fehler zu sehen wären zum Beispiel: falsche Anzahl oder Typ von Parameter, Knoten welche es in der Netzliste nicht gibt.
Sollte bei den Berechnungen ein Unsigned Integer Overflow stattfinden soll
ausgegeben werden.
Sollte der Nutzer den selben existenten Knoten 2 mal eingeben ist die Impedanz mit 0 anzugeben.
Sollte der Imaginärteil negativ ausfallen ist das '+' vor dem 'j' durch ein '-' zu ersetzen.
Nach der Eingabe und Berechnung/Fehlerbehandlung soll wieder die Eingabeaufforderung erscheinen.
Zum Beenden des Programms kann der Nutzer 'q' eingeben oder ein End Of File senden.
Darauf soll das Programm
ausgeben und beendet werden.
Beispiele
Berechnung der Impedanzen mit dem Netzlistenbeispiel('basic_netlist') von oben:
Rückgabewerte und Fehlermeldungen
Bei falschen Aufrufen des Programms:
Rückgabewert: 1
Sollte während der Laufzeit der Speicher ausgehen:
Rückgabewert: 2
Sollte das <netlist> File nicht gefunden werden:
Rückgabewert: 3
Sollte die gegebene netlist fehlerhaft sein:
Rückgabewert: 4
Sollte omega keine Zahl, > UINT_MAX oder <= 0 sein:
Rückgabewert: 5
Sollte der Nenner einer Rationale Zahl 0 werden:
Rückgabewert: 6
Bonusaufgaben
Beliebig viele Knoten in der Netzliste (+1 Punkt)
Hier soll gezeigt werden dass man auch mit dynamischen Speicher arbeiten kann. Dies wird nicht automatisiert getestet und soll beim Abgabegespräch vorgezeigt werden.
einfache Parallelschaltungen (+1 Punkte)
Parallelschaltungen von mehreren Bauteilen zwischen 2 aneinander liegenden Knoten. Auch dies soll beim Abgabegespräch vorgezeigt werden.
beliebige Schaltungen (+2 Punkte)
Es soll möglich sein jegliche Kombination von gültigen Netzlisten zu unterstützen und auch die Impedanz zwischen beliebigen Knoten zu berechnen.
Bei dieser Aufgabe wird eine vereinfachte SPICE netlist verwendet um ein elektrisches Netz zu berechnen.
Um die Aufgabe einfach und übersichtlich zu halten beschränken sich die Netzwerke auf Serienschaltungen und passive Bauteile (R, L, C).
Es wird besonderer Wert auf eine korrekte Fehlerbehandlung gelegt.
Programmaufruf
Das Programm wird mit folgenden Parametern aufgerufen (wobei die Argumente inklusive der Klammern mit entsprechenden Werten zu ersetzen sind):
./ass [netlist_filename] [omega]netlist_filename: Pfad zur netlist-Datei welche geparsed und verarbeitet werden soll. (Inputdatei)
omega: Ganzzahlige Angabe der Berechnung '2*PI*f' bei welcher die Impedanz berechnet werden soll.
Ein korrekter Programmaufruf könnte so aussehen:
./ass test.netlist 314Rationale Zahlen
Um die Berechnungen durchführbar zu machen ist es wichtig Rationale Zahlen darstellen zu können. In dieser Übung soll die Darstellung
(ZÄHLER/NENNER) verwendet werden.
Bei der Rechnung mit diesen Bruchzahlen oder einer Ausgabe gilt es diese so weit wie möglich zu kürzen.
Auch alle Zwischenergebnisse von Berechnungen sind so weit wie möglich zu kürzen.
Eine 0 soll als (0/1) dargestellt werden.
Berechnung:
Um unsere Impedanz zu berechnen brauchen wir die Blindwiderstände von Spulen und Kondensatoren.
Spule:
j*(<omega>*L/1)Kondensator:
-j*(1/(<omega>*C))SPICE Netlist
Wir verwenden eine stark vereinfachte Version von netlist. Wie bereits in der Einleitung erwähnt sollen nur in Serie geschaltete RLC-Elemete möglich sein.
Die Zeilen in der Netlist haben folgendes Format:
BAUTEILNAME KNOTEN_A KNOTEN_B WERT
Zwischen den Bereichen (also zum Beispiel zwischen KNOTEN_A und KNOTEN_B) in der Zeile steht mindestens ein Leerzeichen. Wobei der BAUTEILNAME nur mit R,L,C beginnen darf und eine nachfolgende Nummer (ganzzahlig max. 5 Stellen) enthält. Zusätzlich darf es der Einfachheit halber zwischen zwei Knoten nur ein Bauteil geben (Serienschaltung). Der WERT besteht immer aus einer Bruchzahl.
Die Knoten sind immer als ganze Zahlen angegeben, der erste Knoten hat immer die Nummer 0. Die Knoten existieren immer aufeinander folgend, d.h. es kann kein Bauteil geben welches zwischen z.B. Knoten 2 und 4 liegt. Zur Einfachheit müssen nur maximal 20 aufeinander folgende Knoten unterstützt werden, d.h es kann nur Knoten Nummern von 0 bis 19 geben.
Es soll auch möglich sein Kommentare zu verarbeiten:
*Dies ist ein KommentarKommentare dürfen nur alleine in einer Zeile stehen, das erste Zeichen ist ein *.
Leere Zeilen in der Netlist sollen ebenso wie Kommentare von der Verarbeitung übersprungen werden.
Beispiel einer Netlist:
* Simple netlist test for EP
R1 0 1 (100/1)
C0 1 2 (1/1000000)
L1 2 3 (47/1000)Bei diesem Beispiel ist der Widerstand R1 mit dem Kondensator C0 und der Induktivität L1 in dieser Reihenfolge in Serie geschaltet. Die Elemente müssen eine durchgehende Verbindung bilden. Die Zeilen in der netlist-Datei müssen nicht zwingend in dieser Reihenfolge sein, daher muss vom Programm eine entsprechende Sortierung durchgeführt werden.
Leerzeichen vor Kommentarzeilen und vor und am Ende von Bauteilzeilen können beliebig behandelt werden. Als Zeilenumbruch soll sowohl \n als auch \r\n möglich sein.
Die Brüche in der netlist können auch noch zu kürzen sein.
Eine leere Netzliste ist zwar gültig der Nutzer wird jedoch keine Berechnungen durchführen können.
Es ist ungültig einen Wert mit dem Nenner von 0 anzugeben.
Bauteilnamen dürfen nur einmalig vergeben werden. Dies ist vom Programm zu überprüfen.
Der maximale Wert der in der Netzliste angegeben werden darf ist (UINT_MAX/UINT_MAX).
Bauteile dürfen auch mit 0 bewertet werden, jedoch nicht negativ.
Eine Zeile in der Netlist ist maximal 128 Zeichen lang.
Ausgabe:
Um das Programm leichter überprüfen zu können soll nach dem Ausführen die Netzliste sortiert und gekürzt ausgegeben werden.
zum Beispiel (mit oben beschriebener netlist):
0 - R1(100/1) - 1
1 - C0(1/1000000) - 2
2 - L1(47/1000) - 3Eine Zeile hat hier die Form:
<Linker Knoten> - <Bauteilname>(<Wert>) - <Rechter Knoten>\nNach dieser Ausgabe soll eine Eingabe für den Nutzer bereitgestellt werden. Diese beginnt mit
ep> Hierbei ist das Leerzeichen nach
'ep>' zu beachten.Eingabe:
Der Nutzer soll nun die Möglichkeit haben sich die Impedanz zwischen 2 Knoten anzeigen zu lassen.
ep> 0 1Die Reihenfolge der Angabe spielt hierbei keine Rolle.
Mit der oben Angegeben Netzliste und dieser Ausgabe soll nun
(100/1) + j(0/1)\nausgegeben werden. Die Ausgabe soll immer Real- und Imaginärteil beinhalten auch wenn einer von diesen 0 ist.
Sollte eine Fehlerhafte Eingabe erfolgen soll
[ERR] This is not possible\nausgegeben werden. Als Fehler zu sehen wären zum Beispiel: falsche Anzahl oder Typ von Parameter, Knoten welche es in der Netzliste nicht gibt.
Sollte bei den Berechnungen ein Unsigned Integer Overflow stattfinden soll
[ERR] An overflow happened.\nausgegeben werden.
Sollte der Nutzer den selben existenten Knoten 2 mal eingeben ist die Impedanz mit 0 anzugeben.
Sollte der Imaginärteil negativ ausfallen ist das '+' vor dem 'j' durch ein '-' zu ersetzen.
Nach der Eingabe und Berechnung/Fehlerbehandlung soll wieder die Eingabeaufforderung erscheinen.
Zum Beenden des Programms kann der Nutzer 'q' eingeben oder ein End Of File senden.
ep> qDarauf soll das Programm
BYE!\nausgeben und beendet werden.
Beispiele
Berechnung der Impedanzen mit dem Netzlistenbeispiel('basic_netlist') von oben:
$ ./ass.exe basic_netlist 300
0 - R1(100/1) - 1
1 - C0(1/1000000) - 2
2 - L1(47/1000) - 3
ep> 0 1
(100/1) + j(0/1)
ep> 0 2
(100/1) - j(10000/3)
ep> 0 3
(100/1) - j(99577/30)
ep> 1 3
(0/1) - j(99577/30)
ep> 0 0
(0/1) + j(0/1)
ep> q
BYE!Rückgabewerte und Fehlermeldungen
Bei falschen Aufrufen des Programms:
[ERR] usage: ./ass netlist omega\nRückgabewert: 1
Sollte während der Laufzeit der Speicher ausgehen:
[ERR] out of memory\nRückgabewert: 2
Sollte das <netlist> File nicht gefunden werden:
[ERR] <netlist> not found\nRückgabewert: 3
Sollte die gegebene netlist fehlerhaft sein:
[ERR] Error in netlist\nRückgabewert: 4
Sollte omega keine Zahl, > UINT_MAX oder <= 0 sein:
[ERR] Invalid omega\nRückgabewert: 5
Sollte der Nenner einer Rationale Zahl 0 werden:
[ERR] Division by zero\nRückgabewert: 6
Bonusaufgaben
Beliebig viele Knoten in der Netzliste (+1 Punkt)
Hier soll gezeigt werden dass man auch mit dynamischen Speicher arbeiten kann. Dies wird nicht automatisiert getestet und soll beim Abgabegespräch vorgezeigt werden.
einfache Parallelschaltungen (+1 Punkte)
Parallelschaltungen von mehreren Bauteilen zwischen 2 aneinander liegenden Knoten. Auch dies soll beim Abgabegespräch vorgezeigt werden.
beliebige Schaltungen (+2 Punkte)
Es soll möglich sein jegliche Kombination von gültigen Netzlisten zu unterstützen und auch die Impedanz zwischen beliebigen Knoten zu berechnen.
Lösungen:
Für diese Aufgabe gibt es noch keine Lösung.
