Skip to content

Commit

Permalink
Initial work on timing data serialization
Browse files Browse the repository at this point in the history
azonenberg committed Jun 3, 2017
1 parent dfd9ea1 commit 6079494
Showing 7 changed files with 118 additions and 9 deletions.
7 changes: 6 additions & 1 deletion src/gp4tchar/main.cpp
Original file line number Diff line number Diff line change
@@ -128,8 +128,13 @@ int main(int argc, char* argv[])
//if(!MeasureLutDelays(sock, hdev))
// return 1;

//Save to disk
string fout = "timing.json";
LogNotice("Saving timing data to file %s\n", fout.c_str());
g_calDevice.SaveTimingData(fout.c_str());

//Print output
LogDebug("Dumping timing data...\n");
LogNotice("Dumping timing data...\n");
{
LogIndenter li;
g_calDevice.PrintTimingData();
42 changes: 42 additions & 0 deletions src/greenpak4/Greenpak4BitstreamEntity.cpp
Original file line number Diff line number Diff line change
@@ -305,3 +305,45 @@ void Greenpak4BitstreamEntity::PrintExtraTimingData(PTVCorner /*corner*/) const
//Empty in base class but need to provide an empty default implementation
//so children don't HAVE to override
}

/**
@brief Writes our parent data
*/
void Greenpak4BitstreamEntity::SaveTimingData(FILE* fp, bool last)
{
fprintf(fp, " \"%s\":\n [\n", GetDescription().c_str());

if(!m_pinToPinDelays.empty())
{
//Loop over each process corner and export the data
auto end = m_pinToPinDelays.end();
end--;
for(auto it : m_pinToPinDelays)
{
fprintf(fp, " {\n");
auto corner = it.first;
fprintf(fp, " \"process\" : \"%s\",\n", corner.GetSpeedAsString().c_str());
fprintf(fp, " \"temp\" : \"%d\",\n", corner.GetTemp());
fprintf(fp, " \"voltage_mv\" : \"%d\",\n", corner.GetVoltage());

fprintf(fp, " \"delays\" :\n {\n");
SaveTimingData(fp, corner);
fprintf(fp, " }\n");

//key is last element, we're done
if(it.first == end->first)
fprintf(fp, " }\n");
else
fprintf(fp, " },\n");
}
}

if(last)
fprintf(fp, " ]\n");
else
fprintf(fp, " ],\n");
}

void Greenpak4BitstreamEntity::SaveTimingData(FILE* fp, PTVCorner corner)
{
}
4 changes: 4 additions & 0 deletions src/greenpak4/Greenpak4BitstreamEntity.h
Original file line number Diff line number Diff line change
@@ -155,6 +155,8 @@ class Greenpak4BitstreamEntity
virtual void PrintTimingData() const;
virtual void PrintExtraTimingData(PTVCorner corner) const;

void SaveTimingData(FILE* fp, bool last);

protected:

///Return our assigned netlist entity, if we have one (or NULL if not)
@@ -212,6 +214,8 @@ class Greenpak4BitstreamEntity
//Derived classes are free to extend this to add support for more complex features
//(for example, Schmitt trigger or output drive strength in an IOB)
std::map<PTVCorner, DelayMap> m_pinToPinDelays;

virtual void SaveTimingData(FILE* fp, PTVCorner corner);
};

#endif
38 changes: 38 additions & 0 deletions src/greenpak4/Greenpak4Device.cpp
Original file line number Diff line number Diff line change
@@ -1260,3 +1260,41 @@ void Greenpak4Device::PrintTimingData() const
for(auto b : m_bitstuff)
b->PrintTimingData();
}

void Greenpak4Device::SaveTimingData(string fname)
{
FILE* fp = fopen(fname.c_str(), "w");
if(!fp)
{
LogError("Couldn't open timing data file %s\n", fname.c_str());
return;
}

string part;
switch(m_part)
{
case GREENPAK4_SLG46140:
part = "SLG46140";
break;

case GREENPAK4_SLG46620:
part = "SLG46620";
break;

case GREENPAK4_SLG46621:
part = "SLG46621";
break;
}

//Header
fprintf(fp, "{\n");
fprintf(fp, " \"part\" : \"%s\",\n", part.c_str());

//Timing data for each IP block
for(size_t i=0; i<m_bitstuff.size(); i++)
m_bitstuff[i]->SaveTimingData(fp, (i+1) == m_bitstuff.size());

//Footer
fprintf(fp, "}\n");
fclose(fp);
}
1 change: 1 addition & 0 deletions src/greenpak4/Greenpak4Device.h
Original file line number Diff line number Diff line change
@@ -330,6 +330,7 @@ class Greenpak4Device
// TIMING

void PrintTimingData() const;
void SaveTimingData(std::string fname);

protected:

32 changes: 24 additions & 8 deletions src/xbpar/PTVCorner.cpp
Original file line number Diff line number Diff line change
@@ -21,9 +21,20 @@
using namespace std;

/**
@brief Gets a human-readable description of this process corner
@brief Gets a human-readable description of this PTV corner
*/
string PTVCorner::toString() const
{
char tmp[128];
snprintf(tmp, sizeof(tmp), "%d °C, %.3f V, %s process corner",
m_dieTemp,
m_voltage * 0.001f,
GetSpeedAsString().c_str());

return string(tmp);
}

string PTVCorner::GetSpeedAsString() const
{
const char* speed;
switch(m_speed)
@@ -40,13 +51,7 @@ string PTVCorner::toString() const
break;
}

char tmp[128];
snprintf(tmp, sizeof(tmp), "%d °C, %.3f V, %s process corner",
m_dieTemp,
m_voltage * 0.001f,
speed);

return string(tmp);
return string(speed);
}

//Comparison operator for STL collections
@@ -71,3 +76,14 @@ bool PTVCorner::operator!=(const PTVCorner& rhs) const
return true;
return false;
}

bool PTVCorner::operator==(const PTVCorner& rhs) const
{
if(m_speed != rhs.m_speed)
return false;
if(m_dieTemp != rhs.m_dieTemp)
return false;
if(m_voltage != rhs.m_voltage)
return false;
return true;
}
3 changes: 3 additions & 0 deletions src/xbpar/PTVCorner.h
Original file line number Diff line number Diff line change
@@ -43,6 +43,8 @@ class PTVCorner
ProcessSpeed GetSpeed() const
{ return m_speed; }

std::string GetSpeedAsString() const;

int GetTemp() const
{ return m_dieTemp; }

@@ -54,6 +56,7 @@ class PTVCorner
//Comparison operator for STL collections
bool operator<(const PTVCorner& rhs) const;
bool operator!=(const PTVCorner& rhs) const;
bool operator==(const PTVCorner& rhs) const;

protected:

0 comments on commit 6079494

Please sign in to comment.