1 // See LICENSE for license details.
2 package sifive.blocks.devices.pwm
6 import diplomacy.LazyModule
7 import rocketchip.{TopNetwork,TopNetworkModule}
8 import uncore.tilelink2.TLFragmenter
10 import sifive.blocks.devices.gpio._
12 class PWMPortIO(c: PWMBundleConfig)(implicit p: Parameters) extends Bundle {
13 val port = Vec(c.ncmp, Bool()).asOutput
14 override def cloneType: this.type = new PWMPortIO(c).asInstanceOf[this.type]
17 class PWMPinsIO(c: PWMBundleConfig)(implicit p: Parameters) extends Bundle {
18 val pwm = Vec(c.ncmp, new GPIOPin)
21 class PWMGPIOPort(c: PWMBundleConfig)(implicit p: Parameters) extends Module {
23 val pwm = new PWMPortIO(c).flip()
24 val pins = new PWMPinsIO(c)
27 GPIOOutputPinCtrl(io.pins.pwm, io.pwm.port.asUInt)
31 this: TopNetwork { val pwmConfigs: Seq[PWMConfig] } =>
33 val pwm = (pwmConfigs.zipWithIndex) map { case (c, i) =>
34 val pwm = LazyModule(new TLPWM(c))
35 pwm.node := TLFragmenter(peripheryBusConfig.beatBytes, cacheBlockBytes)(peripheryBus.node)
36 intBus.intnode := pwm.intnode
41 trait PeripheryPWMBundle {
44 val pwmConfigs: Seq[PWMConfig]
46 val pwm_bc = pwmConfigs.map(_.bc).reduce(_.union(_))
47 val pwms = Vec(pwmConfigs.size, new PWMPortIO(pwm_bc)(p))
50 trait PeripheryPWMModule {
51 this: TopNetworkModule {
52 val outer: PeripheryPWM
53 val io: PeripheryPWMBundle
55 (io.pwms.zipWithIndex zip outer.pwm) foreach { case ((io, i), device) =>
56 io.port := device.module.io.gpio