Initial commit
This commit is contained in:
95
_template_verilator/clock_generator.cpp
Normal file
95
_template_verilator/clock_generator.cpp
Normal file
@@ -0,0 +1,95 @@
|
||||
#include "clock_generator.hpp"
|
||||
|
||||
ClockGenerator::~ClockGenerator()
|
||||
{
|
||||
while (clocks) {
|
||||
clock *next = clocks->next;
|
||||
delete clocks;
|
||||
clocks = next;
|
||||
}
|
||||
};
|
||||
|
||||
void ClockGenerator::add_clock(uint8_t &net, uint64_t period, uint64_t skew)
|
||||
{
|
||||
if (skew >= period) throw "The skew value cannot exceed the period";
|
||||
|
||||
clock *clk = new clock(net, period, skew);
|
||||
net = (clk->position < clk->period / 2) ? 0 : 1;
|
||||
|
||||
if (clocks == NULL)
|
||||
clocks = clk;
|
||||
else {
|
||||
clock *last = clocks;
|
||||
while (last->next)
|
||||
last = last->next;
|
||||
last->next = clk;
|
||||
}
|
||||
};
|
||||
|
||||
uint64_t ClockGenerator::next_event(void)
|
||||
{
|
||||
uint64_t time_to_next = UINT64_MAX;
|
||||
clock *clk = clocks;
|
||||
|
||||
while (clk) {
|
||||
uint64_t ttn;
|
||||
|
||||
if (clk->position < clk->period / 2)
|
||||
ttn = clk->period / 2 - clk->position;
|
||||
else
|
||||
ttn = clk->period - clk->position;
|
||||
|
||||
if (time_to_next > ttn) time_to_next = ttn;
|
||||
|
||||
clk = clk->next;
|
||||
}
|
||||
|
||||
clk = clocks;
|
||||
while (clk) {
|
||||
uint8_t next_val;
|
||||
|
||||
clk->position += time_to_next;
|
||||
if (clk->position >= clk->period) clk->position -= clk->period;
|
||||
|
||||
next_val = (clk->position < clk->period / 2) ? 0 : 1;
|
||||
clk->posedge = (next_val == 1 && clk->net == 0) ? true : false;
|
||||
clk->negedge = (next_val == 0 && clk->net == 1) ? true : false;
|
||||
clk->net = next_val;
|
||||
|
||||
clk = clk->next;
|
||||
}
|
||||
|
||||
return time_to_next;
|
||||
};
|
||||
|
||||
bool ClockGenerator::is_posegde(uint8_t &net)
|
||||
{
|
||||
clock *clk = clocks;
|
||||
bool posedge = false;
|
||||
|
||||
while (clk) {
|
||||
if (std::addressof(net) == std::addressof(clk->net)) {
|
||||
posedge = clk->posedge;
|
||||
break;
|
||||
}
|
||||
clk = clk->next;
|
||||
}
|
||||
|
||||
return posedge;
|
||||
};
|
||||
|
||||
bool ClockGenerator::is_negedge(uint8_t &net)
|
||||
{
|
||||
clock *clk = clocks;
|
||||
bool negedge = false;
|
||||
|
||||
while (clk) {
|
||||
if (std::addressof(net) == std::addressof(clk->net)) {
|
||||
negedge = clk->negedge;
|
||||
break;
|
||||
}
|
||||
clk = clk->next;
|
||||
}
|
||||
|
||||
return negedge;
|
||||
};
|
||||
Reference in New Issue
Block a user