From 3e3715dd68f202ade2d0d5216669eb6a45863e7a Mon Sep 17 00:00:00 2001 From: jackkoenig Date: Thu, 10 Mar 2016 13:30:56 -0800 Subject: Add Module Mappers --- src/main/scala/firrtl/Mappers.scala | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/src/main/scala/firrtl/Mappers.scala b/src/main/scala/firrtl/Mappers.scala index e8d9e072..335bc4aa 100644 --- a/src/main/scala/firrtl/Mappers.scala +++ b/src/main/scala/firrtl/Mappers.scala @@ -194,4 +194,38 @@ object Mappers { def map[T](f: T => T)(implicit magnet: (T => T) => WidthMagnet): Width = magnet(f).map(width) } + // ********** Module Mappers ********** + private trait ModuleMagnet { + def map(module: Module): Module + } + private object ModuleMagnet { + implicit def forStmt(f: Stmt => Stmt) = new ModuleMagnet { + override def map(module: Module): Module = { + module match { + case m: InModule => InModule(m.info, m.name, m.ports, f(m.body)) + case m: ExModule => m + } + } + } + implicit def forPorts(f: Port => Port) = new ModuleMagnet { + override def map(module: Module): Module = { + module match { + case m: InModule => InModule(m.info, m.name, m.ports.map(f), m.body) + case m: ExModule => ExModule(m.info, m.name, m.ports.map(f)) + } + } + } + implicit def forString(f: String => String) = new ModuleMagnet { + override def map(module: Module): Module = { + module match { + case m: InModule => InModule(m.info, f(m.name), m.ports, m.body) + case m: ExModule => ExModule(m.info, f(m.name), m.ports) + } + } + } + } + implicit class ModuleMap(module: Module) { + def map[T](f: T => T)(implicit magnet: (T => T) => ModuleMagnet): Module = magnet(f).map(module) + } + } -- cgit v1.2.3