Skip to content

Commit 2970a62

Browse files
author
Oron Port
committed
handle inline anomaly in DropStructVecs and fix AES verilog 95/2001 compilation and testing
1 parent a86e771 commit 2970a62

File tree

9 files changed

+163
-132
lines changed

9 files changed

+163
-132
lines changed

compiler/stages/src/main/scala/dfhdl/backends.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import dfhdl.compiler.stages.verilog.{VerilogBackend, VerilogPrinter, VerilogDia
88
import dfhdl.compiler.stages.vhdl.{VHDLBackend, VHDLPrinter, VHDLDialect}
99
import dfhdl.compiler.ir.DB
1010
object backends:
11-
protected[dfhdl] class verilog(val dialect: VerilogDialect) extends BackendCompiler:
11+
sealed class verilog(val dialect: VerilogDialect) extends BackendCompiler:
1212
def printer(
1313
cd: CompiledDesign
1414
)(using CompilerOptions, PrinterOptions): Printer =
@@ -28,7 +28,7 @@ object backends:
2828
val sv2012: verilog = new verilog(VerilogDialect.sv2012)
2929
val sv2017: verilog = new verilog(VerilogDialect.sv2017)
3030

31-
protected[dfhdl] class vhdl(val dialect: VHDLDialect) extends BackendCompiler:
31+
sealed class vhdl(val dialect: VHDLDialect) extends BackendCompiler:
3232
def printer(
3333
cd: CompiledDesign
3434
)(using CompilerOptions, PrinterOptions): Printer =

compiler/stages/src/main/scala/dfhdl/compiler/stages/DropStructsVecs.scala

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ case object DropStructsVecs extends Stage:
4646
object PartialSel:
4747
import DFVal.Alias.*
4848
def unapply(partial: ApplyIdx | ApplyRange | SelectField)(using MemberGetSet): Boolean =
49-
replacementMap.contains(partial.relValRef.get) && !handledPartials.contains(partial)
49+
replacementMap.contains(partial.relValRef.get)
5050
///////////////////////////////////////////////////////////////////////////////
5151
// Stage 1: Replace structs and vectors with Bits
5252
///////////////////////////////////////////////////////////////////////////////
@@ -147,7 +147,7 @@ case object DropStructsVecs extends Stage:
147147
given RefGen = RefGen.fromGetSet
148148
// we need to reverse the list because we want to handle the innermost partial first
149149
val patchList2: List[(DFMember, Patch)] = stage1.members.view.reverse.collect {
150-
case partial @ PartialSel() =>
150+
case partial @ PartialSel() if !handledPartials.contains(partial) =>
151151
val dsn = new MetaDesign(
152152
partial,
153153
Patch.Add.Config.ReplaceWithLast(Patch.Replace.Config.FullReplacement)

compiler/stages/src/test/scala/StagesSpec/DropStructsVecsSpec.scala

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,4 +245,30 @@ class DropStructsVecsSpec extends StageSpec(stageCreatesUnrefAnons = true):
245245
|""".stripMargin
246246
)
247247
}
248+
249+
test("Inline anomaly") {
250+
given options.CompilerOptions.Backend = backends.verilog.v95
251+
val Rcon: Bits[8] X 4 X 2 <> CONST = DFVector(Bits(8) X 4 X 2)(
252+
DFVector(Bits(8) X 4)(h"01", h"02", h"03", h"04"),
253+
DFVector(Bits(8) X 4)(h"05", h"06", h"07", h"08")
254+
)
255+
256+
extension (lhs: Bits[8] X 4 <> VAL)
257+
@inline def +++(rhs: Bits[8] X 4 <> VAL): Bits[8] X 4 <> DFRET =
258+
lhs.elements.lazyZip(rhs.elements).map(_ ^ _).toList
259+
260+
class Bar extends RTDesign:
261+
val o = Bits[8] X 4 <> OUT
262+
o := Rcon(0) +++ Rcon(0)
263+
val top = (new Bar).dropStructsVecs
264+
assertCodeString(
265+
top,
266+
"""|val Rcon: Bits[64] <> CONST = ((h"01", h"02", h"03", h"04").toBits, (h"05", h"06", h"07", h"08").toBits).toBits
267+
|class Bar extends RTDesign:
268+
| val o = Bits(32) <> OUT
269+
| o := (Rcon(63, 56) ^ Rcon(63, 56), Rcon(55, 48) ^ Rcon(55, 48), Rcon(47, 40) ^ Rcon(47, 40), Rcon(39, 32) ^ Rcon(39, 32)).toBits
270+
|end Bar
271+
|""".stripMargin
272+
)
273+
}
248274
end DropStructsVecsSpec

lib/src/test/resources/ref/AES.CipherSpecNoOpaques/verilog.v2001/hdl/keyExpansion.v

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -304,9 +304,9 @@ module keyExpansion(
304304
assign w_1 = key[95:64];
305305
assign w_2 = key[63:32];
306306
assign w_3 = key[31:0];
307-
assign keySchedule_part_000 = w_0[31:24] ^ (o_part_subWord_inst_o[31:24] ^ Rcon[1][31:24]);
308-
assign keySchedule_part_001 = w_0[23:16] ^ (o_part_subWord_inst_o[23:16] ^ Rcon[1][23:16]);
309-
assign keySchedule_part_002 = w_0[15:8] ^ (o_part_subWord_inst_o[15:8] ^ Rcon[1][15:8]);
307+
assign keySchedule_part_000 = w_0[31:24] ^ (o_part_subWord_inst_o[31:24] ^ Rcon[319:312]);
308+
assign keySchedule_part_001 = w_0[23:16] ^ (o_part_subWord_inst_o[23:16] ^ Rcon[311:304]);
309+
assign keySchedule_part_002 = w_0[15:8] ^ (o_part_subWord_inst_o[15:8] ^ Rcon[303:296]);
310310
assign keySchedule_part_003 = w_0[7:0] ^ (o_part_subWord_inst_o[7:0] ^ Rcon[295:288]);
311311
assign keySchedule_part_004 = w_1[31:24] ^ keySchedule_part_000;
312312
assign keySchedule_part_005 = w_1[23:16] ^ keySchedule_part_001;
@@ -321,9 +321,9 @@ module keyExpansion(
321321
assign lhs_part_02 = w_3[15:8] ^ keySchedule_part_010;
322322
assign lhs_part_03 = w_3[7:0] ^ keySchedule_part_011;
323323
assign lhs_part_04 = {lhs_part_00, lhs_part_01, lhs_part_02, lhs_part_03};
324-
assign keySchedule_part_012 = keySchedule_part_000 ^ (subWord_inst_0_o[31:24] ^ Rcon[2][31:24]);
325-
assign keySchedule_part_013 = keySchedule_part_001 ^ (subWord_inst_0_o[23:16] ^ Rcon[2][23:16]);
326-
assign keySchedule_part_014 = keySchedule_part_002 ^ (subWord_inst_0_o[15:8] ^ Rcon[2][15:8]);
324+
assign keySchedule_part_012 = keySchedule_part_000 ^ (subWord_inst_0_o[31:24] ^ Rcon[287:280]);
325+
assign keySchedule_part_013 = keySchedule_part_001 ^ (subWord_inst_0_o[23:16] ^ Rcon[279:272]);
326+
assign keySchedule_part_014 = keySchedule_part_002 ^ (subWord_inst_0_o[15:8] ^ Rcon[271:264]);
327327
assign keySchedule_part_015 = keySchedule_part_003 ^ (subWord_inst_0_o[7:0] ^ Rcon[263:256]);
328328
assign keySchedule_part_016 = keySchedule_part_004 ^ keySchedule_part_012;
329329
assign keySchedule_part_017 = keySchedule_part_005 ^ keySchedule_part_013;
@@ -338,9 +338,9 @@ module keyExpansion(
338338
assign lhs_part_07 = lhs_part_02 ^ keySchedule_part_022;
339339
assign lhs_part_08 = lhs_part_03 ^ keySchedule_part_023;
340340
assign lhs_part_09 = {lhs_part_05, lhs_part_06, lhs_part_07, lhs_part_08};
341-
assign keySchedule_part_024 = keySchedule_part_012 ^ (subWord_inst_1_o[31:24] ^ Rcon[3][31:24]);
342-
assign keySchedule_part_025 = keySchedule_part_013 ^ (subWord_inst_1_o[23:16] ^ Rcon[3][23:16]);
343-
assign keySchedule_part_026 = keySchedule_part_014 ^ (subWord_inst_1_o[15:8] ^ Rcon[3][15:8]);
341+
assign keySchedule_part_024 = keySchedule_part_012 ^ (subWord_inst_1_o[31:24] ^ Rcon[255:248]);
342+
assign keySchedule_part_025 = keySchedule_part_013 ^ (subWord_inst_1_o[23:16] ^ Rcon[247:240]);
343+
assign keySchedule_part_026 = keySchedule_part_014 ^ (subWord_inst_1_o[15:8] ^ Rcon[239:232]);
344344
assign keySchedule_part_027 = keySchedule_part_015 ^ (subWord_inst_1_o[7:0] ^ Rcon[231:224]);
345345
assign keySchedule_part_028 = keySchedule_part_016 ^ keySchedule_part_024;
346346
assign keySchedule_part_029 = keySchedule_part_017 ^ keySchedule_part_025;
@@ -355,9 +355,9 @@ module keyExpansion(
355355
assign lhs_part_12 = lhs_part_07 ^ keySchedule_part_034;
356356
assign lhs_part_13 = lhs_part_08 ^ keySchedule_part_035;
357357
assign lhs_part_14 = {lhs_part_10, lhs_part_11, lhs_part_12, lhs_part_13};
358-
assign keySchedule_part_036 = keySchedule_part_024 ^ (subWord_inst_2_o[31:24] ^ Rcon[4][31:24]);
359-
assign keySchedule_part_037 = keySchedule_part_025 ^ (subWord_inst_2_o[23:16] ^ Rcon[4][23:16]);
360-
assign keySchedule_part_038 = keySchedule_part_026 ^ (subWord_inst_2_o[15:8] ^ Rcon[4][15:8]);
358+
assign keySchedule_part_036 = keySchedule_part_024 ^ (subWord_inst_2_o[31:24] ^ Rcon[223:216]);
359+
assign keySchedule_part_037 = keySchedule_part_025 ^ (subWord_inst_2_o[23:16] ^ Rcon[215:208]);
360+
assign keySchedule_part_038 = keySchedule_part_026 ^ (subWord_inst_2_o[15:8] ^ Rcon[207:200]);
361361
assign keySchedule_part_039 = keySchedule_part_027 ^ (subWord_inst_2_o[7:0] ^ Rcon[199:192]);
362362
assign keySchedule_part_040 = keySchedule_part_028 ^ keySchedule_part_036;
363363
assign keySchedule_part_041 = keySchedule_part_029 ^ keySchedule_part_037;
@@ -372,9 +372,9 @@ module keyExpansion(
372372
assign lhs_part_17 = lhs_part_12 ^ keySchedule_part_046;
373373
assign lhs_part_18 = lhs_part_13 ^ keySchedule_part_047;
374374
assign lhs_part_19 = {lhs_part_15, lhs_part_16, lhs_part_17, lhs_part_18};
375-
assign keySchedule_part_048 = keySchedule_part_036 ^ (subWord_inst_3_o[31:24] ^ Rcon[5][31:24]);
376-
assign keySchedule_part_049 = keySchedule_part_037 ^ (subWord_inst_3_o[23:16] ^ Rcon[5][23:16]);
377-
assign keySchedule_part_050 = keySchedule_part_038 ^ (subWord_inst_3_o[15:8] ^ Rcon[5][15:8]);
375+
assign keySchedule_part_048 = keySchedule_part_036 ^ (subWord_inst_3_o[31:24] ^ Rcon[191:184]);
376+
assign keySchedule_part_049 = keySchedule_part_037 ^ (subWord_inst_3_o[23:16] ^ Rcon[183:176]);
377+
assign keySchedule_part_050 = keySchedule_part_038 ^ (subWord_inst_3_o[15:8] ^ Rcon[175:168]);
378378
assign keySchedule_part_051 = keySchedule_part_039 ^ (subWord_inst_3_o[7:0] ^ Rcon[167:160]);
379379
assign keySchedule_part_052 = keySchedule_part_040 ^ keySchedule_part_048;
380380
assign keySchedule_part_053 = keySchedule_part_041 ^ keySchedule_part_049;
@@ -389,9 +389,9 @@ module keyExpansion(
389389
assign lhs_part_22 = lhs_part_17 ^ keySchedule_part_058;
390390
assign lhs_part_23 = lhs_part_18 ^ keySchedule_part_059;
391391
assign lhs_part_24 = {lhs_part_20, lhs_part_21, lhs_part_22, lhs_part_23};
392-
assign keySchedule_part_060 = keySchedule_part_048 ^ (subWord_inst_4_o[31:24] ^ Rcon[6][31:24]);
393-
assign keySchedule_part_061 = keySchedule_part_049 ^ (subWord_inst_4_o[23:16] ^ Rcon[6][23:16]);
394-
assign keySchedule_part_062 = keySchedule_part_050 ^ (subWord_inst_4_o[15:8] ^ Rcon[6][15:8]);
392+
assign keySchedule_part_060 = keySchedule_part_048 ^ (subWord_inst_4_o[31:24] ^ Rcon[159:152]);
393+
assign keySchedule_part_061 = keySchedule_part_049 ^ (subWord_inst_4_o[23:16] ^ Rcon[151:144]);
394+
assign keySchedule_part_062 = keySchedule_part_050 ^ (subWord_inst_4_o[15:8] ^ Rcon[143:136]);
395395
assign keySchedule_part_063 = keySchedule_part_051 ^ (subWord_inst_4_o[7:0] ^ Rcon[135:128]);
396396
assign keySchedule_part_064 = keySchedule_part_052 ^ keySchedule_part_060;
397397
assign keySchedule_part_065 = keySchedule_part_053 ^ keySchedule_part_061;
@@ -406,9 +406,9 @@ module keyExpansion(
406406
assign lhs_part_27 = lhs_part_22 ^ keySchedule_part_070;
407407
assign lhs_part_28 = lhs_part_23 ^ keySchedule_part_071;
408408
assign lhs_part_29 = {lhs_part_25, lhs_part_26, lhs_part_27, lhs_part_28};
409-
assign keySchedule_part_072 = keySchedule_part_060 ^ (subWord_inst_5_o[31:24] ^ Rcon[7][31:24]);
410-
assign keySchedule_part_073 = keySchedule_part_061 ^ (subWord_inst_5_o[23:16] ^ Rcon[7][23:16]);
411-
assign keySchedule_part_074 = keySchedule_part_062 ^ (subWord_inst_5_o[15:8] ^ Rcon[7][15:8]);
409+
assign keySchedule_part_072 = keySchedule_part_060 ^ (subWord_inst_5_o[31:24] ^ Rcon[127:120]);
410+
assign keySchedule_part_073 = keySchedule_part_061 ^ (subWord_inst_5_o[23:16] ^ Rcon[119:112]);
411+
assign keySchedule_part_074 = keySchedule_part_062 ^ (subWord_inst_5_o[15:8] ^ Rcon[111:104]);
412412
assign keySchedule_part_075 = keySchedule_part_063 ^ (subWord_inst_5_o[7:0] ^ Rcon[103:96]);
413413
assign keySchedule_part_076 = keySchedule_part_064 ^ keySchedule_part_072;
414414
assign keySchedule_part_077 = keySchedule_part_065 ^ keySchedule_part_073;
@@ -423,9 +423,9 @@ module keyExpansion(
423423
assign lhs_part_32 = lhs_part_27 ^ keySchedule_part_082;
424424
assign lhs_part_33 = lhs_part_28 ^ keySchedule_part_083;
425425
assign lhs_part_34 = {lhs_part_30, lhs_part_31, lhs_part_32, lhs_part_33};
426-
assign keySchedule_part_084 = keySchedule_part_072 ^ (subWord_inst_6_o[31:24] ^ Rcon[8][31:24]);
427-
assign keySchedule_part_085 = keySchedule_part_073 ^ (subWord_inst_6_o[23:16] ^ Rcon[8][23:16]);
428-
assign keySchedule_part_086 = keySchedule_part_074 ^ (subWord_inst_6_o[15:8] ^ Rcon[8][15:8]);
426+
assign keySchedule_part_084 = keySchedule_part_072 ^ (subWord_inst_6_o[31:24] ^ Rcon[95:88]);
427+
assign keySchedule_part_085 = keySchedule_part_073 ^ (subWord_inst_6_o[23:16] ^ Rcon[87:80]);
428+
assign keySchedule_part_086 = keySchedule_part_074 ^ (subWord_inst_6_o[15:8] ^ Rcon[79:72]);
429429
assign keySchedule_part_087 = keySchedule_part_075 ^ (subWord_inst_6_o[7:0] ^ Rcon[71:64]);
430430
assign keySchedule_part_088 = keySchedule_part_076 ^ keySchedule_part_084;
431431
assign keySchedule_part_089 = keySchedule_part_077 ^ keySchedule_part_085;
@@ -440,9 +440,9 @@ module keyExpansion(
440440
assign lhs_part_37 = lhs_part_32 ^ keySchedule_part_094;
441441
assign lhs_part_38 = lhs_part_33 ^ keySchedule_part_095;
442442
assign lhs_part_39 = {lhs_part_35, lhs_part_36, lhs_part_37, lhs_part_38};
443-
assign keySchedule_part_096 = keySchedule_part_084 ^ (subWord_inst_7_o[31:24] ^ Rcon[9][31:24]);
444-
assign keySchedule_part_097 = keySchedule_part_085 ^ (subWord_inst_7_o[23:16] ^ Rcon[9][23:16]);
445-
assign keySchedule_part_098 = keySchedule_part_086 ^ (subWord_inst_7_o[15:8] ^ Rcon[9][15:8]);
443+
assign keySchedule_part_096 = keySchedule_part_084 ^ (subWord_inst_7_o[31:24] ^ Rcon[63:56]);
444+
assign keySchedule_part_097 = keySchedule_part_085 ^ (subWord_inst_7_o[23:16] ^ Rcon[55:48]);
445+
assign keySchedule_part_098 = keySchedule_part_086 ^ (subWord_inst_7_o[15:8] ^ Rcon[47:40]);
446446
assign keySchedule_part_099 = keySchedule_part_087 ^ (subWord_inst_7_o[7:0] ^ Rcon[39:32]);
447447
assign keySchedule_part_100 = keySchedule_part_088 ^ keySchedule_part_096;
448448
assign keySchedule_part_101 = keySchedule_part_089 ^ keySchedule_part_097;
@@ -457,9 +457,9 @@ module keyExpansion(
457457
assign lhs_part_42 = lhs_part_37 ^ keySchedule_part_106;
458458
assign lhs_part_43 = lhs_part_38 ^ keySchedule_part_107;
459459
assign lhs_part_44 = {lhs_part_40, lhs_part_41, lhs_part_42, lhs_part_43};
460-
assign keySchedule_part_108 = keySchedule_part_096 ^ (subWord_inst_8_o[31:24] ^ Rcon[10][31:24]);
461-
assign keySchedule_part_109 = keySchedule_part_097 ^ (subWord_inst_8_o[23:16] ^ Rcon[10][23:16]);
462-
assign keySchedule_part_110 = keySchedule_part_098 ^ (subWord_inst_8_o[15:8] ^ Rcon[10][15:8]);
460+
assign keySchedule_part_108 = keySchedule_part_096 ^ (subWord_inst_8_o[31:24] ^ Rcon[31:24]);
461+
assign keySchedule_part_109 = keySchedule_part_097 ^ (subWord_inst_8_o[23:16] ^ Rcon[23:16]);
462+
assign keySchedule_part_110 = keySchedule_part_098 ^ (subWord_inst_8_o[15:8] ^ Rcon[15:8]);
463463
assign keySchedule_part_111 = keySchedule_part_099 ^ (subWord_inst_8_o[7:0] ^ Rcon[7:0]);
464464
assign keySchedule_part_112 = keySchedule_part_100 ^ keySchedule_part_108;
465465
assign keySchedule_part_113 = keySchedule_part_101 ^ keySchedule_part_109;

0 commit comments

Comments
 (0)