blob: 636dd013dc07fc743b983e0f54868fd6bea335b3 [file]
// 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_