| // Copyright 2023 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 |
| // |
| // https://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. |
| |
| #ifndef MPACT_SIM_DECODER_EXTRACT_H_ |
| #define MPACT_SIM_DECODER_EXTRACT_H_ |
| |
| #include <string> |
| #include <vector> |
| |
| #include "absl/strings/string_view.h" |
| |
| // This file defines utility functions for parsing a bit mask and creating an |
| // extraction recipe of shifts and masks, as well as a function to extract |
| // the bitfield value from a format using the shift recipe. A third function |
| // is defined to write out c code that performs the extraction. |
| |
| namespace mpact { |
| namespace sim { |
| namespace decoder { |
| namespace bin_format { |
| |
| // A single step of the extraction. (value >> shift) & mask. |
| struct ExtractionStep { |
| uint64_t mask; |
| int shift; |
| }; |
| |
| using ExtractionRecipe = std::vector<ExtractionStep>; |
| |
| // Using the extraction recipe given, perform the extraction from the input |
| // value and return the result. |
| uint64_t ExtractValue(uint64_t value, const ExtractionRecipe &recipe); |
| |
| // Using the extraction recipe given, return a string that has the C code for |
| // performing the extraction assuming the input value is stored in a variable |
| // with the name stored in 'value' and the result should be stored in variable |
| // named as stored in 'result'. Each line in the code is indented by 'indent'. |
| std::string WriteExtraction(const ExtractionRecipe &recipe, |
| absl::string_view value, absl::string_view result, |
| absl::string_view indent); |
| |
| // Based on the bit mask passed in 'value', create a mask, shift and or recipe |
| // to extract the corresponding bits in a packed format without changing the |
| // order of the bits left to right. |
| // E.g. 1010 would produce the recipe: |
| // shift right 1, mask 0b01 |
| // shift right 2, mask 0b10 |
| ExtractionRecipe GetExtractionRecipe(uint64_t value); |
| |
| } // namespace bin_format |
| } // namespace decoder |
| } // namespace sim |
| } // namespace mpact |
| #endif // MPACT_SIM_DECODER_EXTRACT_H_ |