joe 发表于 2021-8-23 21:32:11

rocketchip高级参数化机制--源码(1)

要想了解rocketchip的高级参数化---site/here/up机制,先将源码放在此,后面再来分析及使用:
// Copyright 2016-2019 SiFive, Inc.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package chipsalliance.rocketchip

object config {
abstract class Field private (val default: Option)
{
    def this() = this(None)
    def this(default: T) = this(Some(default))
}

abstract class View {
    final def apply(pname: Field): T = apply(pname, this)
    final def apply(pname: Field, site: View): T = {
      val out = find(pname, site)
      require (out.isDefined, s"Key ${pname} is not defined in Parameters")
      out.get
    }

    final def lift(pname: Field): Option = lift(pname, this)
    final def lift(pname: Field, site: View): Option = find(pname, site).map(_.asInstanceOf)

    protected def find(pname: Field, site: View): Option
}

abstract class Parameters extends View {
    // x alter y: settings in 'y' overrule settings in 'x'
    final def alter(rhs: Parameters): Parameters =
      new ChainParameters(rhs, this)

    final def alter(f: (View, View, View) => PartialFunction): Parameters =
      alter(Parameters(f))

    final def alterPartial(f: PartialFunction): Parameters =
      alter(Parameters((_,_,_) => f))

    final def alterMap(m: Map): Parameters =
      alter(new MapParameters(m))

    protected def chain(site: View, tail: View, pname: Field): Option
    protected def find(pname: Field, site: View) = chain(site, new TerminalView, pname)

    // x orElse y: settings in 'x' overrule settings in 'y'
    final def orElse(x: Parameters): Parameters = x.alter(this)

    // Please use 'alter' or 'orElse' instead of '++'.
    // People expect this to be alter (like Map ++ Map), but it's orElse.
    final def ++ (x: Parameters): Parameters = orElse(x)
}

object Parameters {
    def empty: Parameters = new EmptyParameters
    def apply(f: (View, View, View) => PartialFunction): Parameters = new PartialParameters(f)
}

class Config(p: Parameters) extends Parameters {
    def this(f: (View, View, View) => PartialFunction) = this(Parameters(f))

    protected def chain(site: View, tail: View, pname: Field) = p.chain(site, tail, pname)
    override def toString = this.getClass.getSimpleName
    def toInstance = this
}

// Internal implementation:

private class TerminalView extends View {
    def find(pname: Field, site: View): Option = pname.default
}

private class ChainView(head: Parameters, tail: View) extends View {
    def find(pname: Field, site: View) = head.chain(site, tail, pname)
}

private class ChainParameters(x: Parameters, y: Parameters) extends Parameters {
    def chain(site: View, tail: View, pname: Field) = x.chain(site, new ChainView(y, tail), pname)
}

private class EmptyParameters extends Parameters {
    def chain(site: View, tail: View, pname: Field) = tail.find(pname, site)
}

private class PartialParameters(f: (View, View, View) => PartialFunction) extends Parameters {
    protected def chain(site: View, tail: View, pname: Field) = {
      val g = f(site, this, tail)
      if (g.isDefinedAt(pname)) Some(g.apply(pname).asInstanceOf) else tail.find(pname, site)
    }
}

private class MapParameters(map: Map) extends Parameters {
    protected def chain(site: View, tail: View, pname: Field) = {
      val g = map.get(pname)
      if (g.isDefined) Some(g.get.asInstanceOf) else tail.find(pname, site)
    }
}
}


页: [1]
查看完整版本: rocketchip高级参数化机制--源码(1)