Adding ISDIMM support

Added ISDIMM support for Bonnell machine

Change-Id: Ifdb2fc9e2d38267c8eb6cd5848d30102ab48efd1
Signed-off-by: jinuthomas <jinu.joy.thomas@in.ibm.com>
diff --git a/vpd-parser/isdimm_vpd_parser.hpp b/vpd-parser/isdimm_vpd_parser.hpp
new file mode 100644
index 0000000..cbcb1d5
--- /dev/null
+++ b/vpd-parser/isdimm_vpd_parser.hpp
@@ -0,0 +1,153 @@
+#pragma once
+
+#include "impl.hpp"
+#include "parser_interface.hpp"
+#include "types.hpp"
+
+namespace openpower
+{
+namespace vpd
+{
+namespace memory
+{
+namespace parser
+{
+using ParserInterface = openpower::vpd::parser::interface::ParserInterface;
+using kwdVpdMap = inventory::KeywordVpdMap;
+
+class isdimmVpdParser : public ParserInterface
+{
+  public:
+    isdimmVpdParser() = delete;
+    isdimmVpdParser(const isdimmVpdParser&) = delete;
+    isdimmVpdParser& operator=(const isdimmVpdParser&) = delete;
+    isdimmVpdParser(isdimmVpdParser&&) = delete;
+    isdimmVpdParser& operator=(isdimmVpdParser&&) = delete;
+    ~isdimmVpdParser() = default;
+
+    /**
+     * @brief Constructor
+     *
+     * Move memVpdVector to parser object's memVpdVector
+     */
+    isdimmVpdParser(const Binary& VpdVector) : memVpd(VpdVector)
+    {
+    }
+
+    /**
+     * @brief Parse the memory SPD binary data.
+     * Collects and emplace the keyword-value pairs in map.
+     *
+     * @return map of keyword:value
+     */
+    std::variant<kwdVpdMap, Store> parse();
+
+    /**
+     * @brief An api to return interface name with respect to
+     * published data on cache
+     *
+     * @return - Interface name for that vpd type.
+     */
+    std::string getInterfaceName() const;
+
+  private:
+    /**
+     * @brief An api to read keywords.
+     *
+     * @return- map of kwd:value
+     */
+    kwdVpdMap readKeywords(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function calculates DIMM size from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated data or 0 in case of any error.
+     */
+    auto getDDR4DimmCapacity(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function calculates part number from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated part number.
+     */
+    auto getDDR4PartNumber(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function calculates serial number from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated serial number.
+     */
+    auto getDDR4SerialNumber(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function allocates FRU number based on part number
+     *
+     * @param[in] partNumber - part number of the DIMM
+     * @return allocated FRU number.
+     */
+    auto getDDR4FruNumber(const std::string& partNumber);
+
+    /**
+     * @brief This function allocates CCIN based on part number
+     *
+     * @param[in] partNumber - part number of the DIMM
+     * @return allocated CCIN.
+     */
+    auto getDDR4CCIN(const std::string& partNumber);
+
+    /**
+     * @brief This function calculates DIMM size from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated data or 0 in case of any error.
+     */
+    auto getDDR5DimmCapacity(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function calculates part number from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated part number.
+     */
+    auto getDDR5PartNumber(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function calculates serial number from SPD
+     *
+     * @param[in] iterator - iterator to buffer containing SPD
+     * @return calculated serial number.
+     */
+    auto getDDR5SerialNumber(Binary::const_iterator& iterator);
+
+    /**
+     * @brief This function allocates FRU number based on part number
+     *
+     * @param[in] partNumber - part number of the DIMM
+     * @return allocated FRU number.
+     */
+    auto getDDR5FruNumber(const std::string& partNumber);
+
+    /**
+     * @brief This function allocates CCIN based on part number
+     *
+     * @param[in] partNumber - part number of the DIMM
+     * @return allocated CCIN.
+     */
+    auto getDDR5CCIN(const std::string& partNumber);
+
+    // vdp file to be parsed
+    const Binary& memVpd;
+};
+
+inline std::string isdimmVpdParser::getInterfaceName() const
+{
+    return constants::memVpdInf;
+}
+
+} // namespace parser
+} // namespace memory
+} // namespace vpd
+} // namespace openpower