| // Copyright 2024 Google LLC |
| // |
| // 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 common |
| |
| import chisel3._ |
| import chisel3.experimental.BundleLiterals._ |
| |
| // Performs a (partial) assertion on a bundle as part of a test. |
| // - Accepts same input as bundle literals. |
| // - Prints a summary in case of failure. |
| // - Returns the result. It does not throw anything. |
| object AssertPartial { |
| def apply[T <: Bundle](act: T, hint: String, printfn: String => Unit, exp: T => (Data, Data)*): Boolean = { |
| val good = exp.map { e => |
| val (x, y) = e(act) |
| x.litValue == y.litValue |
| } |
| val all_pass = good.fold(true)((x, y) => x & y) |
| if (!all_pass) { |
| val exp_bundle = chiselTypeOf(act).Lit(exp:_*) |
| printfn(s"Assertion failure: $hint") |
| printfn(s"Expected: $exp_bundle") |
| printfn(s"Actual: $act") |
| } |
| all_pass |
| } |
| } |
| |
| // Prints a summary from a sequence of test results, and returns |
| // whether all cases are good. |
| object ProcessTestResults { |
| def apply(good: Seq[Boolean], printfn: String => Unit) = { |
| val good_count = good.count(x => x) |
| val count = good.length |
| printfn(s"$good_count / $count passed") |
| good_count == good.length |
| } |
| } |