// See LICENSE.SiFive for license details.

package freechips.rocketchip.tilelink

import Chisel._
import freechips.rocketchip.config.Parameters
import freechips.rocketchip.regmapper._

case class ExampleParams(num: Int, address: BigInt)

trait ExampleBundle
{
  val params: ExampleParams
  val gpio = UInt(width = params.num)
}

trait ExampleModule extends HasRegMap
{
  val params: ExampleParams
  val io: ExampleBundle
  val interrupts: Vec[Bool]

  val state = RegInit(UInt(0, width = params.num))
  val pending = RegInit(UInt(0xf, width = 4))

  io.gpio := state
  interrupts := pending.toBools

  regmap(
    0 -> Seq(
      RegField(params.num, state,
        RegFieldDesc("state", "State: Example of a R/W Register with description.", reset = Some(0)))),
    4 -> Seq(
      RegField.w1ToClear(4, pending, state,
        Some(RegFieldDesc("pending", "Pending: Example of a special (W1ToC) Register. " +
          "Writing a bit here causes it to be reset to 0. " +
          "The bits are set when the corresponding bit in 'state' is high.",
          reset=Some(0xF), volatile=true))))
  )
}

// Create a concrete TL2 version of the abstract Example slave
class TLExample(params: ExampleParams)(implicit p: Parameters)
  extends TLRegisterRouter(params.address, "somedev", Seq("ucbbar,random-interface"), 4)(
  new TLRegBundle(params, _)    with ExampleBundle)(
  new TLRegModule(params, _, _) with ExampleModule)
