Skip to content
This repository has been archived by the owner on Aug 20, 2024. It is now read-only.

Commit

Permalink
Fix bug in zero-width memory removal (bp #2153) (#2155)
Browse files Browse the repository at this point in the history
* Fix bug in zero-width memory removal (#2153)

* Fix bug in zero-width memory removal

Correctly remove all extraneous connections to all types of memory
ports (read, write, readwrite) for zero-width memories.  Previously,
only read ports were correctly handled.

Signed-off-by: Schuyler Eldridge <[email protected]>

* fixup! Fix bug in zero-width memory removal

(cherry picked from commit 67ce97a)

# Conflicts:
#	src/main/scala/firrtl/passes/ZeroWidth.scala

* fixup! Fix bug in zero-width memory removal (#2153)

Co-authored-by: Schuyler Eldridge <[email protected]>
  • Loading branch information
mergify[bot] and seldridge authored Mar 26, 2021
1 parent e2f6e60 commit 0861510
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 17 deletions.
36 changes: 19 additions & 17 deletions src/main/scala/firrtl/passes/ZeroWidth.scala
Original file line number Diff line number Diff line change
Expand Up @@ -24,25 +24,27 @@ object ZeroWidth extends Transform with DependencyAPIMigration {
case _ => false
}

private def makeEmptyMemBundle(name: String): Field =
Field(name, Flip, BundleType(Seq(
Field("addr", Default, UIntType(IntWidth(0))),
Field("en", Default, UIntType(IntWidth(0))),
Field("clk", Default, UIntType(IntWidth(0))),
Field("data", Flip, UIntType(IntWidth(0)))
)))
private def makeZero(tpe: ir.Type): ir.Type = tpe match {
case ClockType => UIntType(IntWidth(0))
case a: UIntType => a.copy(IntWidth(0))
case a: SIntType => a.copy(IntWidth(0))
case a: AggregateType => a.map(makeZero)
}

private def onEmptyMemStmt(s: Statement): Statement = s match {
case d @ DefMemory(info, name, tpe, _, _, _, rs, ws, rws, _) => removeZero(tpe) match {
case None =>
DefWire(info, name, BundleType(
rs.map(r => makeEmptyMemBundle(r)) ++
ws.map(w => makeEmptyMemBundle(w)) ++
rws.map(rw => makeEmptyMemBundle(rw))
))
case Some(_) => d
}
case sx => sx map onEmptyMemStmt
case d @ DefMemory(info, name, tpe, _, _, _, rs, ws, rws, _) =>
removeZero(tpe) match {
case None =>
DefWire(
info,
name,
MemPortUtils
.memType(d)
.map(makeZero)
)
case Some(_) => d
}
case sx => sx.map(onEmptyMemStmt)
}

private def onModuleEmptyMemStmt(m: DefModule): DefModule = {
Expand Down
63 changes: 63 additions & 0 deletions src/test/scala/firrtlTests/ZeroWidthTests.scala
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,69 @@ class ZeroWidthTests extends FirrtlFlatSpec {
| z <= asUInt(y)""".stripMargin
(parse(exec(input))) should be(parse(check))
}

"Memories with zero-width data-type" should "be fully removed" in {
val input =
"""circuit Foo:
| module Foo:
| input clock: Clock
| input rAddr: UInt<4>
| input rEn: UInt<1>
| output rData: UInt<0>
| input wAddr: UInt<4>
| input wEn: UInt<1>
| input wMask: UInt<1>
| input wData: UInt<0>
| input rwEn: UInt<1>
| input rwMode: UInt<1>
| input rwAddr: UInt<1>
| input rwMask: UInt<1>
| input rwDataIn: UInt<0>
| output rwDataOut: UInt<0>
|
| mem memory:
| data-type => UInt<0>
| depth => 16
| reader => r
| writer => w
| readwriter => rw
| read-latency => 0
| write-latency => 1
| read-under-write => undefined
|
| memory.r.clk <= clock
| memory.r.en <= rEn
| memory.r.addr <= rAddr
| rData <= memory.r.data
| memory.w.clk <= clock
| memory.w.en <= wEn
| memory.w.addr <= wAddr
| memory.w.mask <= wMask
| memory.w.data <= wData
| memory.rw.clk <= clock
| memory.rw.en <= rwEn
| memory.rw.addr <= rwAddr
| memory.rw.wmode <= rwMode
| memory.rw.wmask <= rwMask
| memory.rw.wdata <= rwDataIn
| rwDataOut <= memory.rw.rdata""".stripMargin
val check =
s"""circuit Foo:
| module Foo:
| input clock: Clock
| input rAddr: UInt<4>
| input rEn: UInt<1>
| input wAddr: UInt<4>
| input wEn: UInt<1>
| input wMask: UInt<1>
| input rwEn: UInt<1>
| input rwMode: UInt<1>
| input rwAddr: UInt<1>
| input rwMask: UInt<1>
|
|${Seq.tabulate(17)(_ => " skip").mkString("\n")}""".stripMargin
parse(exec(input)) should be(parse(check))
}
}

class ZeroWidthVerilog extends FirrtlFlatSpec {
Expand Down

0 comments on commit 0861510

Please sign in to comment.