Skip to content

Commit

Permalink
libtrellis: Adding ChipConfig class for high level chip config
Browse files Browse the repository at this point in the history
Signed-off-by: David Shah <davey1576@gmail.com>
  • Loading branch information
gatecat committed Jul 8, 2018
1 parent 63e8f70 commit 8889805
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 1 deletion.
1 change: 1 addition & 0 deletions libtrellis/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ aux_source_directory(src/ SOURCE_FILES)

add_library(trellis SHARED ${INCLUDE_FILES} ${SOURCE_FILES})
PYTHON_ADD_MODULE(pytrellis ${INCLUDE_FILES} ${SOURCE_FILES})
target_compile_definitions(pytrellis PRIVATE INCLUDE_PYTHON=1)
target_compile_definitions(trellis PRIVATE FUZZ_SAFETY_CHECK=1)
target_compile_definitions(pytrellis PRIVATE FUZZ_SAFETY_CHECK=1)
target_link_libraries(trellis LINK_PUBLIC ${Boost_LIBRARIES} ${PYTHON_LIBRARIES})
Expand Down
29 changes: 29 additions & 0 deletions libtrellis/include/ChipConfig.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#ifndef CHIPCONFIG_H
#define CHIPCONFIG_H

#include "TileConfig.hpp"
#include <map>
#include <vector>
#include <string>

using namespace std;

namespace Trellis {

class Chip;

// This represents the configuration of a chip at a high level
class ChipConfig
{
string chip_name;
vector<string> metadata;
map<string, TileConfig> tiles;
string to_string() const;
static ChipConfig from_string(const string &config);
Chip to_chip() const;
static ChipConfig from_chip(const Chip &chip);
};

}

#endif
2 changes: 2 additions & 0 deletions libtrellis/include/TileConfig.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ struct TileConfig {

string to_string() const;
static TileConfig from_string(const string &str);

bool empty() const;
};

ostream &operator<<(ostream &out, const TileConfig &tc);
Expand Down
78 changes: 78 additions & 0 deletions libtrellis/src/ChipConfig.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
#include "ChipConfig.hpp"
#include "Chip.hpp"
#include "BitDatabase.hpp"
#include "Database.hpp"
#include "Tile.hpp"
#include <sstream>
#include <iostream>

namespace Trellis {

string ChipConfig::to_string() const
{
stringstream ss;
ss << ".device " << chip_name << endl << endl;
for (const auto &meta : metadata)
ss << ".comment " << meta << endl;
ss << endl;
for (const auto &tile : tiles) {
if (!tile.second.empty()) {
ss << ".tile " << tile.first << endl;
ss << tile.second;
ss << endl;
}
}
return ss.str();
}

ChipConfig ChipConfig::from_string(const string &config)
{
stringstream ss(config);
ChipConfig cc;
while (!skip_check_eof(ss)) {
std::string verb;
ss >> verb;
if (verb == ".device") {
ss >> cc.chip_name;
} else if (verb == ".comment") {
std::string line;
getline(ss, line);
cc.metadata.push_back(line);
} else if (verb == ".tile") {
std::string tilename;
ss >> tilename;
TileConfig tc;
ss >> tc;
cc.tiles[tilename] = tc;
} else {
throw runtime_error("unrecognised config entry " + verb);
}
}
return cc;
}

Chip ChipConfig::to_chip() const
{
Chip c(chip_name);
c.metadata = metadata;
for (auto tile_entry : tiles) {
auto chip_tile = c.tiles.at(tile_entry.first);
auto tile_db = get_tile_bitdata(TileLocator{c.info.family, c.info.name, chip_tile->info.type});
tile_db->config_to_tile_cram(tile_entry.second, chip_tile->cram);
}
return c;
}

ChipConfig ChipConfig::from_chip(const Chip &chip)
{
ChipConfig cc;
cc.chip_name = chip.info.name;
cc.metadata = chip.metadata;
for (auto tile : chip.tiles) {
auto tile_db = get_tile_bitdata(TileLocator{chip.info.family, chip.info.name, tile.second->info.type});
cc.tiles[tile.first] = tile_db->tile_cram_to_config(tile.second->cram);
}
return cc;
}

}
3 changes: 2 additions & 1 deletion libtrellis/src/PyTrellis.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
using namespace boost::python;
using namespace Trellis;


#ifdef INCLUDE_PYTHON
void translate_bspe(const BitstreamParseError &e) {
// Use the Python 'C' API to set up an exception object
PyErr_SetString(PyExc_ValueError, e.what());
Expand Down Expand Up @@ -343,3 +343,4 @@ BOOST_PYTHON_MODULE (pytrellis) {
.def("add_wire", &RoutingGraph::add_wire);

}
#endif
4 changes: 4 additions & 0 deletions libtrellis/src/TileConfig.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -126,4 +126,8 @@ TileConfig TileConfig::from_string(const string &str) {
return tc;
}

bool TileConfig::empty() const {
return carcs.empty() && cwords.empty() && cenums.empty() && cunknowns.empty();
}

}

0 comments on commit 8889805

Please sign in to comment.