text: #ifndef LIBTRELLIS_DATABASE_HPP
  #define LIBTRELLIS_DATABASE_HPP
  
  #include <string>
  #include <cstdint>
  #include <vector>
  #include <unordered_map>
  #include <memory>
  using namespace std;
  
  namespace Trellis {
  // This MUST be called before any operations (such as creating a Chip or reading a bitstream)
  // that require database access.
  void load_database(string root);
  
  // Locator for a given FPGA (formed of family and device)
  struct DeviceLocator {
      string family;
      string device;
  };
  
  // Locator for a given tile type (formed of family, device and tile type)
  struct TileLocator {
      inline TileLocator() {};
      inline TileLocator(string f, string d, string t) : family(f), device(d), tiletype(t) {};
      string family;
      string device;
      string tiletype;
  };
  
  inline bool operator==(const TileLocator &a, const TileLocator &b) {
      return (a.family == b.family) && (a.device == b.device) && (a.tiletype == b.tiletype);
  }
  
  // Search the device list by part name
  DeviceLocator find_device_by_name(string name);
  
  // Search the device list by ID
  DeviceLocator find_device_by_idcode(uint32_t idcode);
  
  struct ChipInfo;
  
  // Obtain basic information about a device
  ChipInfo get_chip_info(const DeviceLocator &part);
  
  struct Ecp5GlobalsInfo;
  struct MachXO2GlobalsInfo;
  
  // Obtain global network information for a chip
  Ecp5GlobalsInfo get_global_info_ecp5(const DeviceLocator &part);
  MachXO2GlobalsInfo get_global_info_machxo2(const DeviceLocator &part);
  
  // Obtain the tilegrid for a part
  struct TileInfo;
  
  vector<TileInfo> get_device_tilegrid(const DeviceLocator &part);
  
  // Obtain the BitDatabase for a device/tile combination
  // BitDatabases are a singleton
  class TileBitDatabase;
  shared_ptr<TileBitDatabase> get_tile_bitdata(const TileLocator &tile);
  
  }
  
  // Hash function for TileLocator
  namespace std {
  template<> struct hash<Trellis::TileLocator> {
  public:
      inline size_t operator()(const Trellis::TileLocator &tile) const {
          hash<string> hash_fn;
          return hash_fn(tile.family) + hash_fn(tile.device) + hash_fn(tile.tiletype);
      }
  };
  
  }
  
  #endif //LIBTRELLIS_DATABASE_HPP
  