X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmain%2Fscala%2Fdevices%2Fpwm%2FPWM.scala;h=638100496dabfb564b597a335d05e57c68aef041;hb=4fcf349adb9e66ea7d8cc5394de5d3e0a2340985;hp=d46732cbae2e9f493421efa1588498a160f62406;hpb=072d0c1b58e15933b344f79077cc62b9e73f0dd7;p=sifive-blocks.git diff --git a/src/main/scala/devices/pwm/PWM.scala b/src/main/scala/devices/pwm/PWM.scala index d46732c..6381004 100644 --- a/src/main/scala/devices/pwm/PWM.scala +++ b/src/main/scala/devices/pwm/PWM.scala @@ -2,18 +2,17 @@ package sifive.blocks.devices.pwm import Chisel._ +import chisel3.experimental.MultiIOModule import Chisel.ImplicitConversions._ -import config._ -import regmapper._ -import rocketchip.PeripheryBusConfig -import uncore.tilelink2._ -import util._ - +import freechips.rocketchip.config.Parameters +import freechips.rocketchip.regmapper._ +import freechips.rocketchip.tilelink._ +import freechips.rocketchip.util._ import sifive.blocks.util.GenericTimer // Core PWM Functionality & Register Interface -class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16)(implicit p: Parameters) extends GenericTimer { +class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16) extends GenericTimer { protected def countWidth = ((1 << scaleWidth) - 1) + cmpWidth protected lazy val countAlways = RegEnable(io.regs.cfg.write.bits(12), Bool(false), io.regs.cfg.write.valid && unlocked) protected lazy val feed = count.carryOut(scale + UInt(cmpWidth)) @@ -38,35 +37,31 @@ class PWM(val ncmp: Int = 4, val cmpWidth: Int = 16)(implicit p: Parameters) ext countEn := countAlways || oneShot } -case class PWMConfig( +case class PWMParams( address: BigInt, size: Int = 0x1000, regBytes: Int = 4, ncmp: Int = 4, cmpWidth: Int = 16) -trait HasPWMParameters { - implicit val p: Parameters - val params: PWMConfig - val c = params -} - -trait PWMBundle extends Bundle with HasPWMParameters { - val gpio = Vec(c.ncmp, Bool()).asOutput +trait HasPWMBundleContents extends Bundle { + def params: PWMParams + val gpio = Vec(params.ncmp, Bool()).asOutput } -trait PWMModule extends Module with HasRegMap with HasPWMParameters { - val io: PWMBundle +trait HasPWMModuleContents extends MultiIOModule with HasRegMap { + val io: HasPWMBundleContents + val params: PWMParams - val pwm = Module(new PWM(c.ncmp, c.cmpWidth)) + val pwm = Module(new PWM(params.ncmp, params.cmpWidth)) interrupts := pwm.io.ip io.gpio := pwm.io.gpio - regmap((GenericTimer.timerRegMap(pwm, 0, c.regBytes)):_*) + regmap((GenericTimer.timerRegMap(pwm, 0, params.regBytes)):_*) } -class TLPWM(c: PWMConfig)(implicit p: Parameters) - extends TLRegisterRouter(c.address, interrupts = c.ncmp, size = c.size, beatBytes = p(PeripheryBusConfig).beatBytes)( - new TLRegBundle(c, _) with PWMBundle)( - new TLRegModule(c, _, _) with PWMModule) +class TLPWM(w: Int, c: PWMParams)(implicit p: Parameters) + extends TLRegisterRouter(c.address, "pwm", Seq("sifive,pwm0"), interrupts = c.ncmp, size = c.size, beatBytes = w)( + new TLRegBundle(c, _) with HasPWMBundleContents)( + new TLRegModule(c, _, _) with HasPWMModuleContents)