Generate a C header of Parameters.scala
- Reflect out all Int type parameters, and generate a header file. The
fields are named KP_originalScalaName.
Change-Id: I2915aa9971fc7741aa0bbf423c6d2138fd61087f
diff --git a/hdl/chisel/src/kelvin/BUILD b/hdl/chisel/src/kelvin/BUILD
index 516690a..9873eed 100644
--- a/hdl/chisel/src/kelvin/BUILD
+++ b/hdl/chisel/src/kelvin/BUILD
@@ -12,8 +12,11 @@
# See the License for the specific language governing permissions and
# limitations under the License.
-load("@kelvin_hw//rules:chisel.bzl", "chisel_cc_library", "chisel_library",
- "chisel_test")
+load("@kelvin_hw//rules:chisel.bzl",
+ "chisel_binary",
+ "chisel_cc_library",
+ "chisel_library",
+ "chisel_test")
package(default_visibility = ["//visibility:public"])
@@ -220,3 +223,21 @@
emit_class = "kelvin.EmitVSt",
module_name = "VSt",
)
+
+chisel_binary(
+ name = "emit_parameters_header",
+ deps = [
+ ":kelvin",
+ ],
+ main_class = "kelvin.EmitParametersHeader",
+)
+
+genrule(
+ name = "parameters_header",
+ outs = [
+ "kelvin_parameters.h",
+ ],
+ tools = [":emit_parameters_header"],
+ cmd = "$(location :emit_parameters_header) > $(location kelvin_parameters.h)",
+ visibility = ["//visibility:public"],
+)
diff --git a/hdl/chisel/src/kelvin/Parameters.scala b/hdl/chisel/src/kelvin/Parameters.scala
index 35b4929..0080486 100644
--- a/hdl/chisel/src/kelvin/Parameters.scala
+++ b/hdl/chisel/src/kelvin/Parameters.scala
@@ -52,7 +52,7 @@
// Machine.
val programCounterBits = 32
val instructionBits = 32
- val instructionLanes = 4
+ val instructionLanes = 8
val vectorCountBits = log2Ceil(vectorBits / 8) + 1 + 2 // +2 stripmine
@@ -98,3 +98,33 @@
val axi2AddrBits = 32
val axi2DataBits = vectorBits
}
+
+import scala.reflect.runtime.{universe => ru}
+object EmitParametersHeader extends App {
+ val p = new Parameters
+ val mirror = ru.runtimeMirror(ru.getClass.getClassLoader)
+ val instanceMirror = mirror.reflect(p)
+ val symbol = instanceMirror.symbol
+ val typeSym = symbol.toType
+ val fields = typeSym.decls.collect {
+ case t: (ru.TermSymbol @unchecked) if t.isVal || t.isVar => t
+ }
+
+ println("#ifndef KELVIN_PARAMETERS_H_")
+ println("#define KELVIN_PARAMETERS_H_")
+ fields.foreach { x =>
+ val fieldMirror = instanceMirror.reflectField(x.asTerm)
+ val fieldType = x.asTerm.typeSignature
+ val value = fieldMirror.get
+ val ctype = fieldType match {
+ case t if t =:= ru.typeOf[Int] => Some("int")
+ case _ => None
+ }
+ if (ctype != None) {
+ val ctypeStr = ctype.get
+ println(s"#define KP_${x.name} ${value}")
+ // println(s"${ctypeStr} KP_${x.name} = ${value};")
+ }
+ }
+ println("#endif")
+}
diff --git a/tests/verilator_sim/BUILD b/tests/verilator_sim/BUILD
index 10c126e..65963de 100644
--- a/tests/verilator_sim/BUILD
+++ b/tests/verilator_sim/BUILD
@@ -34,6 +34,7 @@
"kelvin/debug_if.h",
"kelvin/kelvin_cfg.h",
"kelvin/memory_if.h",
+ "@kelvin_hw//hdl/chisel/src/kelvin:kelvin_parameters.h",
],
defines = ["KELVIN_SIMD=256"],
)