Skip to content

Commit d16f5dc

Browse files
committed
lowering: Add micro architecture lowering
1 parent add3805 commit d16f5dc

File tree

8 files changed

+75
-33
lines changed

8 files changed

+75
-33
lines changed

vadl/main/vadl/ast/Definition.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4348,15 +4348,16 @@ enum ProcessKind {
43484348

43494349
class MicroArchitectureDefinition extends Definition implements IdentifiableNode {
43504350
Identifier id;
4351-
IsId processor;
4351+
@Child
4352+
IsId isa;
43524353
@Child
43534354
List<Definition> definitions;
43544355
SourceLocation loc;
43554356

4356-
MicroArchitectureDefinition(Identifier id, IsId processor, List<Definition> definitions,
4357+
MicroArchitectureDefinition(Identifier id, IsId isa, List<Definition> definitions,
43574358
SourceLocation loc) {
43584359
this.id = id;
4359-
this.processor = processor;
4360+
this.isa = isa;
43604361
this.definitions = definitions;
43614362
this.loc = loc;
43624363
}
@@ -4387,7 +4388,7 @@ void prettyPrint(int indent, StringBuilder builder) {
43874388
builder.append("micro architecture ");
43884389
id.prettyPrint(0, builder);
43894390
builder.append(" implements ");
4390-
processor.prettyPrint(0, builder);
4391+
isa.prettyPrint(0, builder);
43914392
builder.append(" = {\n");
43924393
prettyPrintDefinitions(indent + 1, builder, definitions);
43934394
builder.append(prettyIndentString(indent)).append("}\n");
@@ -4403,13 +4404,13 @@ public boolean equals(Object o) {
44034404
}
44044405
MicroArchitectureDefinition that = (MicroArchitectureDefinition) o;
44054406
return Objects.equals(id, that.id)
4406-
&& Objects.equals(processor, that.processor)
4407+
&& Objects.equals(isa, that.isa)
44074408
&& Objects.equals(definitions, that.definitions);
44084409
}
44094410

44104411
@Override
44114412
public int hashCode() {
4412-
return Objects.hash(id, processor, definitions);
4413+
return Objects.hash(id, isa, definitions);
44134414
}
44144415

44154416
}

vadl/main/vadl/ast/MacroExpander.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -897,7 +897,7 @@ public Definition visit(CpuProcessDefinition definition) {
897897

898898
@Override
899899
public Definition visit(MicroArchitectureDefinition definition) {
900-
return new MicroArchitectureDefinition(definition.id, definition.processor,
900+
return new MicroArchitectureDefinition(definition.id, definition.isa,
901901
expandDefinitions(definition.definitions), copyLoc(definition.loc)
902902
).withAnnotations(expandAnnotations(definition.annotations));
903903
}

vadl/main/vadl/ast/TypeChecker.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1876,7 +1876,12 @@ public Void visit(CpuProcessDefinition definition) {
18761876

18771877
@Override
18781878
public Void visit(MicroArchitectureDefinition definition) {
1879-
throwUnimplemented(definition);
1879+
if (!(definition.isa.target() instanceof InstructionSetDefinition)) {
1880+
throw error("ISA required", definition.isa)
1881+
.locationDescription(definition.isa, "A MIA implements an ISA but this points to a %s",
1882+
definition.isa.target().getClass().getSimpleName()).build();
1883+
}
1884+
definition.definitions.forEach(this::check);
18801885
return null;
18811886
}
18821887

vadl/main/vadl/ast/ViamLowering.java

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,15 +67,19 @@
6767
import vadl.viam.Function;
6868
import vadl.viam.Instruction;
6969
import vadl.viam.InstructionSetArchitecture;
70+
import vadl.viam.Logic;
7071
import vadl.viam.Memory;
7172
import vadl.viam.MemoryRegion;
73+
import vadl.viam.MicroArchitecture;
7274
import vadl.viam.PrintableInstruction;
7375
import vadl.viam.Procedure;
7476
import vadl.viam.Processor;
7577
import vadl.viam.PseudoInstruction;
7678
import vadl.viam.RegisterTensor;
7779
import vadl.viam.Relocation;
80+
import vadl.viam.Signal;
7881
import vadl.viam.Specification;
82+
import vadl.viam.Stage;
7983
import vadl.viam.asm.AsmDirectiveMapping;
8084
import vadl.viam.asm.AsmModifier;
8185
import vadl.viam.asm.AsmToken;
@@ -1460,8 +1464,30 @@ public Optional<vadl.viam.Definition> visit(MemoryDefinition definition) {
14601464

14611465
@Override
14621466
public Optional<vadl.viam.Definition> visit(MicroArchitectureDefinition definition) {
1463-
throw new RuntimeException("The ViamGenerator does not support `%s` yet".formatted(
1464-
definition.getClass().getSimpleName()));
1467+
var identifier = generateIdentifier(definition.viamId, definition.identifier());
1468+
var isa = visitIsa(
1469+
(InstructionSetDefinition) requireNonNull(definition.isa.target()));
1470+
1471+
var children = definition.definitions.stream().map(this::fetch).filter(Optional::isPresent)
1472+
.map(Optional::orElseThrow).toList();
1473+
var stages = filterAndCastToInstance(children, Stage.class);
1474+
var logic = filterAndCastToInstance(children, Logic.class);
1475+
var signals = filterAndCastToInstance(children, Signal.class);
1476+
var registers = filterAndCastToInstance(children, RegisterTensor.class);
1477+
var memories = filterAndCastToInstance(children, Memory.class);
1478+
var functions = filterAndCastToInstance(children, Function.class);
1479+
1480+
return Optional.of(new MicroArchitecture(
1481+
identifier,
1482+
isa,
1483+
stages,
1484+
logic,
1485+
signals,
1486+
registers,
1487+
memories,
1488+
functions
1489+
)
1490+
);
14651491
}
14661492

14671493
@Override

vadl/main/vadl/dump/infoEnrichers/RtlEnricherCollection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ public class RtlEnricherCollection {
6464
forType(DefinitionEntity.class, (defEntity, passResults) -> {
6565
if (defEntity.origin() instanceof MicroArchitecture mia) {
6666
var mappingExt = mia.extension(MiaMapping.class);
67-
var isaExt = mia.processor().isa().extension(InstructionProgressGraphExtension.class);
67+
var isaExt = mia.isa().extension(InstructionProgressGraphExtension.class);
6868
if (mappingExt != null && isaExt != null) {
6969
var info = InfoUtils.createGraphModal(isaExt.ipg().name, isaExt.ipg().name,
7070
viz(isaExt.ipg(), mappingExt));

vadl/main/vadl/viam/MicroArchitecture.java

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
*/
2727
public class MicroArchitecture extends Definition {
2828

29-
private final Processor processor;
29+
private final InstructionSetArchitecture instructionSetArchitecture;
3030

3131
// Stages and Logic elements
3232
private final List<Stage> stages;
@@ -42,34 +42,39 @@ public class MicroArchitecture extends Definition {
4242
/**
4343
* Create a micro architecture definition.
4444
*
45-
* @param identifier identifier
46-
* @param processor processor definition
47-
* @param stages list of stages
48-
* @param logic list of logic elements
45+
* @param identifier identifier
46+
* @param instructionSetArchitecture processor definition
47+
* @param stages list of stages
48+
* @param logic list of logic elements
4949
*/
50-
public MicroArchitecture(Identifier identifier, Processor processor, List<Stage> stages,
50+
public MicroArchitecture(Identifier identifier,
51+
InstructionSetArchitecture instructionSetArchitecture,
52+
List<Stage> stages,
5153
List<Logic> logic) {
52-
this(identifier, processor, stages, logic, new ArrayList<>(), new ArrayList<>(),
54+
this(identifier, instructionSetArchitecture, stages, logic, new ArrayList<>(),
55+
new ArrayList<>(),
5356
new ArrayList<>(), new ArrayList<>());
5457
}
5558

5659
/**
5760
* Create a micro architecture definition.
5861
*
59-
* @param identifier identifier
60-
* @param processor processor definition
61-
* @param stages list of stages
62-
* @param logic list of logic elements
63-
* @param signals list of signals
64-
* @param registers list of registers (tensors)
65-
* @param memories list of memories
66-
* @param functions list of functions
62+
* @param identifier identifier
63+
* @param instructionSetArchitecture processor definition
64+
* @param stages list of stages
65+
* @param logic list of logic elements
66+
* @param signals list of signals
67+
* @param registers list of registers (tensors)
68+
* @param memories list of memories
69+
* @param functions list of functions
6770
*/
68-
public MicroArchitecture(Identifier identifier, Processor processor, List<Stage> stages,
71+
public MicroArchitecture(Identifier identifier,
72+
InstructionSetArchitecture instructionSetArchitecture,
73+
List<Stage> stages,
6974
List<Logic> logic, List<Signal> signals, List<RegisterTensor> registers,
7075
List<Memory> memories, List<Function> functions) {
7176
super(identifier);
72-
this.processor = processor;
77+
this.instructionSetArchitecture = instructionSetArchitecture;
7378
this.stages = stages;
7479
this.logic = logic;
7580
this.signals = signals;
@@ -85,8 +90,8 @@ public MicroArchitecture(Identifier identifier, Processor processor, List<Stage>
8590
}
8691
}
8792

88-
public Processor processor() {
89-
return processor;
93+
public InstructionSetArchitecture isa() {
94+
return instructionSetArchitecture;
9095
}
9196

9297
public List<Stage> stages() {

vadl/main/vadl/viam/passes/dummyPasses/DummyMiaPass.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,9 @@ public PassName getName() {
120120
return null;
121121
}
122122

123-
var mip = viam.processor().orElse(null);
123+
var isa = viam.isa().orElse(null);
124124

125-
if (mip == null) {
125+
if (isa == null) {
126126
// if there is no mip, we just do nothing
127127
return null;
128128
}
@@ -144,7 +144,7 @@ public PassName getName() {
144144

145145
var mia = new MicroArchitecture(
146146
ident,
147-
mip,
147+
isa,
148148
new ArrayList<>(List.of(fetch, decode, execute, memory, writeBack)),
149149
new ArrayList<>(List.of(bypass, predict))
150150
);

vadl/test/resources/testSource/sys/risc-v/rv32im.vadl

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,4 +279,9 @@ processor Spike implements RV32IM with ABI = {
279279
[ base: 0x80000000 ]
280280
memory region [RAM] DRAM in MEM
281281

282+
}
283+
284+
//[ dataBusWidth : 32 ]
285+
micro architecture FiveStage implements RV32IM = {
286+
282287
}

0 commit comments

Comments
 (0)