// 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_
