X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fdevices%2Fpwm%2FPWMPeriphery.scala;h=7e616da39ffc0fff226923f1b72d04eb22bde383;hb=baccd5ada2ab54381d9f4c75a3e3e72f39b2bcef;hp=06d3d8ebbfe5374bdf3c17091394934199fe3891;hpb=03be9aba67b185b5454e9013901e6f873f62ac9d;p=sifive-blocks.git diff --git a/src/main/scala/devices/pwm/PWMPeriphery.scala b/src/main/scala/devices/pwm/PWMPeriphery.scala index 06d3d8e..7e616da 100644 --- a/src/main/scala/devices/pwm/PWMPeriphery.scala +++ b/src/main/scala/devices/pwm/PWMPeriphery.scala @@ -2,24 +2,28 @@ package sifive.blocks.devices.pwm import Chisel._ -import config._ +import config.Field import diplomacy.LazyModule -import rocketchip.{TopNetwork,TopNetworkModule} +import rocketchip.{ + HasTopLevelNetworks, + HasTopLevelNetworksBundle, + HasTopLevelNetworksModule +} import uncore.tilelink2.TLFragmenter import util.HeterogeneousBag import sifive.blocks.devices.gpio._ -class PWMPortIO(c: PWMConfig)(implicit p: Parameters) extends Bundle { +class PWMPortIO(c: PWMParams) extends Bundle { val port = Vec(c.ncmp, Bool()).asOutput override def cloneType: this.type = new PWMPortIO(c).asInstanceOf[this.type] } -class PWMPinsIO(c: PWMConfig)(implicit p: Parameters) extends Bundle { +class PWMPinsIO(c: PWMParams) extends Bundle { val pwm = Vec(c.ncmp, new GPIOPin) } -class PWMGPIOPort(c: PWMConfig)(implicit p: Parameters) extends Module { +class PWMGPIOPort(c: PWMParams) extends Module { val io = new Bundle { val pwm = new PWMPortIO(c).flip() val pins = new PWMPinsIO(c) @@ -28,31 +32,28 @@ class PWMGPIOPort(c: PWMConfig)(implicit p: Parameters) extends Module { GPIOOutputPinCtrl(io.pins.pwm, io.pwm.port.asUInt) } -trait PeripheryPWM { - this: TopNetwork { val pwmConfigs: Seq[PWMConfig] } => +case object PeripheryPWMKey extends Field[Seq[PWMParams]] - val pwm = (pwmConfigs.zipWithIndex) map { case (c, i) => - val pwm = LazyModule(new TLPWM(c)) - pwm.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node) +trait HasPeripheryPWM extends HasTopLevelNetworks { + val pwmParams = p(PeripheryPWMKey) + val pwms = pwmParams map { params => + val pwm = LazyModule(new TLPWM(peripheryBusBytes, params)) + pwm.node := TLFragmenter(peripheryBusBytes, cacheBlockBytes)(peripheryBus.node) intBus.intnode := pwm.intnode pwm } } -trait PeripheryPWMBundle { - this: { - val p: Parameters - val pwmConfigs: Seq[PWMConfig] - } => - val pwms = HeterogeneousBag(pwmConfigs.map(new PWMPortIO(_)(p))) +trait HasPeripheryPWMBundle extends HasTopLevelNetworksBundle { + val outer: HasPeripheryPWM + val pwms = HeterogeneousBag(outer.pwmParams.map(new PWMPortIO(_))) } -trait PeripheryPWMModule { - this: TopNetworkModule { - val outer: PeripheryPWM - val io: PeripheryPWMBundle - } => - (io.pwms.zipWithIndex zip outer.pwm) foreach { case ((io, i), device) => +trait HasPeripheryPWMModule extends HasTopLevelNetworksModule { + val outer: HasPeripheryPWM + val io: HasPeripheryPWMBundle + + (io.pwms zip outer.pwms) foreach { case (io, device) => io.port := device.module.io.gpio } }