AJA NTV2 SDK  17.5.0.1242
NTV2 SDK 17.5.0.1242
ntv2bitfilemanager.cpp
Go to the documentation of this file.
1 /* SPDX-License-Identifier: MIT */
7 #include "ntv2bitfilemanager.h"
8 #include "ntv2bitfile.h"
9 #include "ntv2utils.h"
10 #include "ajabase/system/debug.h"
11 #include "ajabase/system/file_io.h"
12 #include <iostream>
13 #include <sys/stat.h>
14 #include <assert.h>
15 #if defined (AJALinux) || defined (AJAMac)
16  #include <arpa/inet.h>
17 #endif
18 #include <map>
19 
20 using namespace std;
21 
22 #define BFMFAIL(__x__) AJA_sERROR (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
23 #define BFMWARN(__x__) AJA_sWARNING(AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
24 #define BFMNOTE(__x__) AJA_sNOTICE (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
25 #define BFMINFO(__x__) AJA_sINFO (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
26 #define BFMDBG(__x__) AJA_sDEBUG (AJA_DebugUnit_Firmware, AJAFUNC << ": " << __x__)
27 
28 
30 {
31 }
32 
34 {
35  Clear();
36 }
37 
38 bool CNTV2BitfileManager::AddFile (const string & inBitfilePath)
39 {
40  AJAFileIO Fio;
41  CNTV2Bitfile Bitfile;
42  NTV2BitfileInfo Info;
43 
44  // Open bitfile...
45  if (!Fio.FileExists(inBitfilePath))
46  {BFMFAIL("Bitfile path '" << inBitfilePath << "' not found"); return false;}
47  if (!Bitfile.Open(inBitfilePath))
48  {BFMFAIL("Bitfile '" << inBitfilePath << "' failed to open"); return false;}
49 
50  // get bitfile information
51  Info.bitfilePath = inBitfilePath;
52  Info.designName = Bitfile.GetDesignName();
53  Info.designID = Bitfile.GetDesignID();
54  Info.designVersion = Bitfile.GetDesignVersion();
55  Info.bitfileID = Bitfile.GetBitfileID();
56  Info.bitfileVersion = Bitfile.GetBitfileVersion();
57  if (Bitfile.IsTandem())
59  else if (Bitfile.IsClear())
61  else if (Bitfile.IsPartial())
63  else
64  Info.bitfileFlags = 0;
65  Info.deviceID = Bitfile.GetDeviceID();
66 
67  // Check for reconfigurable bitfile...
68  if ((Info.designID == 0) || (Info.designID > 0xfe))
69  {BFMFAIL("Invalid design ID " << xHEX0N(Info.designID,8) << " for bitfile '" << inBitfilePath << "'"); return false;}
70  if (Info.designVersion > 0xfe)
71  {BFMFAIL("Invalid design version " << xHEX0N(Info.designVersion,8) << " for bitfile '" << inBitfilePath << "'"); return false;}
72  if ((Info.bitfileID > 0xfe))
73  {BFMFAIL("Invalid bitfile ID " << xHEX0N(Info.bitfileID,8) << " for bitfile '" << inBitfilePath << "'"); return false;}
74  if (Info.bitfileVersion > 0xfe)
75  {BFMFAIL("Invalid bitfile version " << xHEX0N(Info.bitfileVersion,8) << " for bitfile '" << inBitfilePath << "'"); return false;}
76  if (Info.bitfileFlags == 0)
77  {BFMFAIL("No flags set for bitfile '" << inBitfilePath << "'"); return false;}
78  if (Info.deviceID == 0)
79  {BFMFAIL("Device ID is zero for bitfile '" << inBitfilePath << "'"); return false;}
80 
81  // Add to list...
82  _bitfileList.push_back(Info);
83  BFMNOTE("Bitfile '" << inBitfilePath << "' successfully added to bitfile manager");
84  return true;
85 }
86 
87 bool CNTV2BitfileManager::AddDirectory (const string & inDirectory)
88 {
89  AJAFileIO Fio;
90 
91  // Check if good directory...
92  if (AJA_FAILURE(Fio.DoesDirectoryExist(inDirectory)))
93  {BFMFAIL("Bitfile directory '" << inDirectory << "' not found"); return false;}
94 
95  // Get bitfiles...
96  NTV2StringList fileContainer;
97  if (AJA_FAILURE(Fio.ReadDirectory(inDirectory, "*.bit", fileContainer)))
98  {BFMFAIL("ReadDirectory '" << inDirectory << "' failed"); return false;}
99 
100  // add bitfiles
101  const size_t origNum(_bitfileList.size());
102  for (NTV2StringListConstIter fcIter(fileContainer.begin()); fcIter != fileContainer.end(); ++fcIter)
103  AddFile(*fcIter);
104  BFMNOTE(DEC(_bitfileList.size() - origNum) << " bitfile(s) added from directory '" << inDirectory << "'");
105 
106  return true;
107 }
108 
110 {
111  if (!_bitfileList.empty() || !_bitstreamList.empty())
112  BFMNOTE(DEC(_bitfileList.size()) << " bitfile(s), " << DEC(_bitstreamList.size()) << " cached bitstream(s) cleared");
113  _bitfileList.clear();
114  _bitstreamList.clear();
115 }
116 
118 {
119  return _bitfileList.size();
120 }
121 
122 
124  const ULWord inDesignID,
125  const ULWord inDesignVersion,
126  const ULWord inBitfileID,
127  const ULWord inBitfileVersion,
128  const ULWord inBitfileFlags)
129 {
130  size_t numBitfiles (GetNumBitfiles());
131  size_t maxNdx (numBitfiles);
132  size_t ndx(0);
133 
134  for (ndx = 0; ndx < numBitfiles; ndx++)
135  { // Search for bitstream...
136  const NTV2BitfileInfo & info (_bitfileList.at(ndx));
137  if (inDesignID == info.designID)
138  if (inDesignVersion == info.designVersion)
139  if (inBitfileID == info.bitfileID)
140  if (inBitfileFlags & info.bitfileFlags)
141  {
142  if (inBitfileVersion == info.bitfileVersion)
143  break;
144  if ((maxNdx >= numBitfiles) || (info.bitfileVersion > _bitfileList.at(maxNdx).bitfileVersion))
145  maxNdx = ndx;
146  }
147  }
148 
149  // Looking for latest version?
150  if ((inBitfileVersion == 0xff) && (maxNdx < numBitfiles))
151  ndx = maxNdx;
152 
153  // Find something?
154  if (ndx == numBitfiles)
155  { BFMFAIL("No bitstream found for designID=" << xHEX0N(inDesignID,8) << " designVers=" << xHEX0N(inDesignVersion,8)
156  << " bitfileID=" << xHEX0N(inBitfileID,8) << " bitfileVers=" << xHEX0N(inBitfileVersion,8));
157  return false;
158  }
159 
160  // Read in bitstream...
161  if (!ReadBitstream(ndx))
162  { BFMFAIL("No bitstream found for designID=" << xHEX0N(inDesignID,8) << " designVers=" << xHEX0N(inDesignVersion,8)
163  << " bitfileID=" << xHEX0N(inBitfileID,8) << " bitfileVers=" << xHEX0N(inBitfileVersion,8));
164  return false;
165  }
166 
167  outBitstream = _bitstreamList[ndx];
168  return true;
169 }
170 
171 bool CNTV2BitfileManager::ReadBitstream (const size_t inIndex)
172 {
173  // Already in cache?
174  if ((inIndex < _bitstreamList.size()) && !_bitstreamList.at(inIndex).IsNULL())
175  return true; // Yes
176 
177  // Open bitfile to get bitstream...
178  CNTV2Bitfile Bitfile;
179  if (!Bitfile.Open(_bitfileList.at(inIndex).bitfilePath))
180  {BFMFAIL("Bitfile '" << _bitfileList.at(inIndex).bitfilePath << "' failed to open"); return false;}
181 
182  // Read bitstream from bitfile (will automatically Allocate it)...
183  NTV2Buffer Bitstream;
184  if (!Bitfile.GetProgramByteStream(Bitstream))
185  {BFMFAIL("GetProgramByteStream failed for bitfile '" << _bitfileList.at(inIndex).bitfilePath << "'"); return false;}
186 
187  if (inIndex >= _bitstreamList.size())
188  _bitstreamList.resize(inIndex + 1);
189 
190  _bitstreamList[inIndex] = Bitstream;
191  BFMDBG("Cached " << DEC(Bitstream.GetByteCount()) << "-byte bitstream for '" << _bitfileList.at(inIndex).bitfilePath << "' at index " << DEC(inIndex));
192  return true;
193 }
NTV2BitfileInfo::designVersion
ULWord designVersion
Version of this core.
Definition: ntv2bitfilemanager.h:36
NTV2BitfileInfo::designName
std::string designName
The design name for this bitfile.
Definition: ntv2bitfilemanager.h:34
NTV2Buffer
A generic user-space buffer object that has an address and a length. Used most often to share an arbi...
Definition: ntv2publicinterface.h:6022
NTV2Buffer::GetByteCount
ULWord GetByteCount(void) const
Definition: ntv2publicinterface.h:6096
BFMFAIL
#define BFMFAIL(__x__)
Definition: ntv2bitfilemanager.cpp:22
CNTV2Bitfile
Instances of me can parse a bitfile.
Definition: ntv2bitfile.h:86
NTV2_BITFILE_FLAG_CLEAR
#define NTV2_BITFILE_FLAG_CLEAR
This is a clear bitfile.
Definition: ntv2bitfilemanager.h:25
NTV2BitfileInfo::deviceID
NTV2DeviceID deviceID
The NTV2DeviceID for this firmware core+personality.
Definition: ntv2bitfilemanager.h:40
CNTV2Bitfile::IsClear
virtual bool IsClear(void) const
Definition: ntv2bitfile.h:164
NTV2BitfileInfo
Bitfile information.
Definition: ntv2bitfilemanager.h:31
CNTV2Bitfile::IsTandem
virtual bool IsTandem(void) const
Definition: ntv2bitfile.h:154
NTV2_BITFILE_FLAG_PARTIAL
#define NTV2_BITFILE_FLAG_PARTIAL
This is a partial bitfile.
Definition: ntv2bitfilemanager.h:24
NTV2BitfileInfo::designID
ULWord designID
Identifies the firmware core (the design base common to all its personalities).
Definition: ntv2bitfilemanager.h:35
CNTV2BitfileManager::Clear
virtual void Clear(void)
Clear the list of bitfiles.
Definition: ntv2bitfilemanager.cpp:109
AJAFileIO::DoesDirectoryExist
static AJAStatus DoesDirectoryExist(const std::string &directory)
Definition: file_io.cpp:1070
CNTV2BitfileManager::AddDirectory
virtual bool AddDirectory(const std::string &inDirectory)
Add the bitfile(s) at the given path to the list of bitfiles.
Definition: ntv2bitfilemanager.cpp:87
BFMDBG
#define BFMDBG(__x__)
Definition: ntv2bitfilemanager.cpp:26
NTV2BitfileInfo::bitfileID
ULWord bitfileID
Identifies the firmware personality.
Definition: ntv2bitfilemanager.h:37
CNTV2Bitfile::Open
virtual bool Open(const std::string &inBitfilePath)
Opens the bitfile at the given path, then parses its header.
Definition: ntv2bitfile.cpp:322
CNTV2Bitfile::GetDeviceID
virtual NTV2DeviceID GetDeviceID(void) const
Definition: ntv2bitfile.cpp:782
NTV2BitfileInfo::bitfilePath
std::string bitfilePath
The path where this bitfile was found.
Definition: ntv2bitfilemanager.h:33
CNTV2Bitfile::GetBitfileID
virtual ULWord GetBitfileID(void) const
Definition: ntv2bitfile.h:184
ULWord
uint32_t ULWord
Definition: ajatypes.h:255
CNTV2Bitfile::GetDesignName
virtual std::string GetDesignName(void) const
Definition: ntv2bitfile.h:139
NTV2BitfileInfo::bitfileVersion
ULWord bitfileVersion
Version of this personality.
Definition: ntv2bitfilemanager.h:38
CNTV2Bitfile::IsPartial
virtual bool IsPartial(void) const
Definition: ntv2bitfile.h:159
ntv2utils.h
Declares numerous NTV2 utility functions.
CNTV2BitfileManager::GetNumBitfiles
virtual size_t GetNumBitfiles(void)
Returns the number of bitfiles.
Definition: ntv2bitfilemanager.cpp:117
NTV2StringList
std::vector< std::string > NTV2StringList
Definition: ntv2utils.h:1143
NTV2BitfileInfo::bitfileFlags
ULWord bitfileFlags
Definition: ntv2bitfilemanager.h:39
CNTV2BitfileManager::GetBitStream
virtual bool GetBitStream(NTV2Buffer &outBitstream, const ULWord inDesignID, const ULWord inDesignVersion, const ULWord inBitfileID, const ULWord inBitfileVersion, const ULWord inBitfileFlags)
Retrieves the bitstream specified by design ID & version, and bitfile ID & version....
Definition: ntv2bitfilemanager.cpp:123
ntv2bitfile.h
Declares the CNTV2Bitfile class.
file_io.h
Declares the AJAFileIO class.
DEC
#define DEC(__x__)
Definition: ntv2publicinterface.h:5606
AJAFileIO::FileExists
static bool FileExists(const std::wstring &fileName)
Definition: file_io.cpp:97
std
Definition: json.hpp:5362
AJAFileIO
Definition: file_io.h:64
NTV2StringListConstIter
NTV2StringList::const_iterator NTV2StringListConstIter
Definition: ntv2utils.h:1145
CNTV2BitfileManager::AddFile
virtual bool AddFile(const std::string &inBitfilePath)
Add the bitfile at the given path to the list of bitfiles.
Definition: ntv2bitfilemanager.cpp:38
ntv2bitfilemanager.h
Declares the CNTV2BitfileManager class that manages Xilinx bitfiles.
CNTV2BitfileManager::CNTV2BitfileManager
CNTV2BitfileManager()
My constructor.
Definition: ntv2bitfilemanager.cpp:29
AJAFileIO::ReadDirectory
static AJAStatus ReadDirectory(const std::string &directory, const std::string &filePattern, std::vector< std::string > &fileContainer)
Definition: file_io.cpp:805
CNTV2Bitfile::GetDesignVersion
virtual ULWord GetDesignVersion(void) const
Definition: ntv2bitfile.h:179
xHEX0N
#define xHEX0N(__x__, __n__)
Definition: ntv2publicinterface.h:5605
AJA_FAILURE
#define AJA_FAILURE(_status_)
Definition: types.h:371
NTV2_BITFILE_FLAG_TANDEM
#define NTV2_BITFILE_FLAG_TANDEM
This is a tandem bitfile.
Definition: ntv2bitfilemanager.h:23
BFMNOTE
#define BFMNOTE(__x__)
Definition: ntv2bitfilemanager.cpp:24
CNTV2BitfileManager::~CNTV2BitfileManager
virtual ~CNTV2BitfileManager()
My destructor.
Definition: ntv2bitfilemanager.cpp:33
debug.h
Declares the AJADebug class.
CNTV2Bitfile::GetBitfileVersion
virtual ULWord GetBitfileVersion(void) const
Definition: ntv2bitfile.h:189
CNTV2Bitfile::GetDesignID
virtual ULWord GetDesignID(void) const
Definition: ntv2bitfile.h:174
CNTV2Bitfile::GetProgramByteStream
virtual size_t GetProgramByteStream(NTV2Buffer &outBuffer)
Retrieves the program bitstream.
Definition: ntv2bitfile.cpp:377