Zeichen #

ss20xyqa
Neuling
Neuling
Beiträge: 7
Registriert: 8. Feb 2017 14:49

Zeichen #

Beitrag von ss20xyqa »

Hallo,

ich hätte eine Frage zu dem Zeichen #.
Mir wird nicht ganz klar wann man das Zeichen setzen muss und wann nicht.

Beispiele:

Aus 2.2.1

Code: Alles auswählen

interface Power#(type t);
 method Action setOperands(t a, t b);
 method t getResult();
 endinterface

 module mkPower(Power#(t))
 provisos(Bits#(t, t_sz),...
Aus 1.3.1

Code: Alles auswählen

interface HelloALU;
 method Action setupCalculation(AluOps op, Int#(32) a, Int#(32) b);
 method ActionValue#(Int#(32)) getResult();
 endinterface
 ...
 
 module mkHelloALU(HelloALU);
 Reg#(Bool) newOperands <- mkReg(False);
 Reg#(Bool) resultValid <- mkReg(False);
 Reg#(AluOps) operation <- mkReg(Mul);
 Reg#(Int#(32)) opA <- mkReg(0);
 Reg#(Int#(32)) opB <- mkReg(0);
 Reg#(Int#(32)) result <- mkReg(0);
 

JHofmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 182
Registriert: 23. Apr 2015 10:43

Re: Zeichen #

Beitrag von JHofmann »

Hallo,

wo genau ist es denn bei dem Beispiel unklar?

Viele Grüße,

ss20xyqa
Neuling
Neuling
Beiträge: 7
Registriert: 8. Feb 2017 14:49

Re: Zeichen #

Beitrag von ss20xyqa »

1. Warum steht bei Power#(type t) bzw. Power#(t) das #?
2. Warum steht es bei method ActionValue#(Int#(32)) getResult() und nicht bei anderen Methoden? (Machmal steht es auch nicht beim ActionValue in den bsv Folien steht auf Seite 23 ActionValue (#int) inc2...)
3. Reg#(Int#(32)) opA <- mkReg(0); Warum steht es bei Registern und bei Int#(32)

Außerdem hätte ich noch eine weitere Frage zu Aufgabe 2.2.2.

Code: Alles auswählen

rule count;
 let counterVal = cntr;
 Maybe#(UInt#(32)) maybeIncr = incrWire.wget();
 Maybe#(UInt#(32)) maybeDecr = decrWire.wget();
Das counterVal, maybeIncr und maybeDecr sollen doch alle Variablen sein.
Warum steht nur bei counterVal let und bei den anderen beiden nicht und was genau bewirkt es dann.

MfG

JHofmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 182
Registriert: 23. Apr 2015 10:43

Re: Zeichen #

Beitrag von JHofmann »

ss20xyqa hat geschrieben:1. Warum steht bei Power#(type t) bzw. Power#(t) das #?
2. Warum steht es bei method ActionValue#(Int#(32)) getResult() und nicht bei anderen Methoden? (Machmal steht es auch nicht beim ActionValue in den bsv Folien steht auf Seite 23 ActionValue (#int) inc2...)
3. Reg#(Int#(32)) opA <- mkReg(0); Warum steht es bei Registern und bei Int#(32)
Für gewöhnlich steht das # dort wenn als Parameter ein Typ übergeben wird. Int#(32) bekommt z.B. den numerischen Typ 32 als Parameter. Genauso bei Reg#(a) was einen Typ als Parameter erwartet. Genauso ist es bei ActionValue. Das Fehlen des # in den Folien dürfte ein Fehler sein.
ss20xyqa hat geschrieben: Das counterVal, maybeIncr und maybeDecr sollen doch alle Variablen sein.
Warum steht nur bei counterVal let und bei den anderen beiden nicht und was genau bewirkt es dann.
Das 'let' überlässt es dem Compiler herauszufinden was für ein Typ das jetzt eigentlich ist. In diesem Fall könnte bei allen drei Variablen 'let' verwendet werden oder halt das 'let' bei 'counterVal' durch den entsprechenden Typ ersetzt werden.

Viele Grüße,

ss20xyqa
Neuling
Neuling
Beiträge: 7
Registriert: 8. Feb 2017 14:49

Re: Zeichen #

Beitrag von ss20xyqa »

Vielen Dank

Roey
Mausschubser
Mausschubser
Beiträge: 54
Registriert: 29. Apr 2015 16:20

Re: Zeichen #

Beitrag von Roey »

JHofmann hat geschrieben:
ss20xyqa hat geschrieben: Das counterVal, maybeIncr und maybeDecr sollen doch alle Variablen sein.
Warum steht nur bei counterVal let und bei den anderen beiden nicht und was genau bewirkt es dann.
Das 'let' überlässt es dem Compiler herauszufinden was für ein Typ das jetzt eigentlich ist. In diesem Fall könnte bei allen drei Variablen 'let' verwendet werden oder halt das 'let' bei 'counterVal' durch den entsprechenden Typ ersetzt werden.

Viele Grüße,
D.h. wir können jedes mal wenn wir uns mit dem Typ unsicher sind let verwenden?

JHofmann
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 182
Registriert: 23. Apr 2015 10:43

Re: Zeichen #

Beitrag von JHofmann »

Das könnte man tun, allgemein ist es allerdings eine schlechte Idee nicht zu wissen welchen Typ welche Variable hat. Am Ende ist es vor allem eine Syntax-Erleichterung die dazu führt nicht, im Zweifel elendig lange, ausgeschriebene Typenbezeichnungen hinschreiben zu müssen. Es gibt auch Fälle in denen der Compiler einen Fehler wirft weil er nicht sicher ist welchen Typ die Variable nun genau hat.

Viele Grüße,

0b101101101
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 179
Registriert: 15. Apr 2015 18:24

Re: Zeichen #

Beitrag von 0b101101101 »

Hm, lässt sich eigentlich der Typ von etwas auch anders angeben, als nur links bei neuen Variablen? Ich hatte mal eine Stelle im Bluespec wo ich von UInt#(8) mit zeroExtend zu UInt#(9) zu FixedPoint konvertieren wollte, allerdings wusste der Kompiler nicht, wie viel Bit das Ergebnis von zeroExtend haben soll da FixedPoint. Ich habe es dann gelöst indem ich eine Funktion definiert habe, bei der ich den Eingabe und Ausgabe-Typ angeben konnte. Aber ich hätte gerne die Typinformationen inline angeben.

In einem vereinfachten Beispiel frage ich mich, ob ich anstelle den Typ links anzugeben wie so:

Code: Alles auswählen

  Reg#(Int#(8)) x <- mkReg(0);
die Typinformationen auch rechts angeben könnte, wie in anderen Sprachen (zb Java):

Code: Alles auswählen

  let x <- mkReg#(Int#(8))(0)
zb Scala:

Code: Alles auswählen

  let x <- mkReg(0 : Int#(8))
zb Cpp:

Code: Alles auswählen

  let x <- mkReg(cast(Int#(8)) 0)

Antworten

Zurück zu „Archiv“