seems to be able to parse signal tree
This commit is contained in:
parent
49d103fd56
commit
8bcd2bc8ec
38
.gitignore
vendored
38
.gitignore
vendored
|
@ -1,2 +1,40 @@
|
|||
/target
|
||||
Cargo.lock
|
||||
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/macos
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=macos
|
||||
|
||||
### macOS ###
|
||||
# General
|
||||
.DS_Store
|
||||
.AppleDouble
|
||||
.LSOverride
|
||||
|
||||
# Icon must end with two \r
|
||||
Icon
|
||||
|
||||
|
||||
# Thumbnails
|
||||
._*
|
||||
|
||||
# Files that might appear in the root of a volume
|
||||
.DocumentRevisions-V100
|
||||
.fseventsd
|
||||
.Spotlight-V100
|
||||
.TemporaryItems
|
||||
.Trashes
|
||||
.VolumeIcon.icns
|
||||
.com.apple.timemachine.donotpresent
|
||||
|
||||
# Directories potentially created on remote AFP share
|
||||
.AppleDB
|
||||
.AppleDesktop
|
||||
Network Trash Folder
|
||||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
### macOS Patch ###
|
||||
# iCloud generated files
|
||||
*.icloud
|
||||
|
||||
# End of https://www.toptal.com/developers/gitignore/api/macos
|
||||
|
|
|
@ -18,7 +18,7 @@ fn main() -> std::io::Result<()> {
|
|||
|
||||
|
||||
let file = File::open(&args.path)?;
|
||||
parse_vcd(file);
|
||||
parse_vcd(file).unwrap();
|
||||
|
||||
Ok(())
|
||||
}
|
245
src/vcd/parse.rs
245
src/vcd/parse.rs
|
@ -1,6 +1,7 @@
|
|||
use chrono::prelude::*;
|
||||
use itertools::Itertools;
|
||||
use std::fs::File;
|
||||
use std::{fs::File};
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
use ::function_name::named;
|
||||
|
||||
use super::*;
|
||||
|
@ -14,43 +15,251 @@ use types::*;
|
|||
mod metadata;
|
||||
use metadata::*;
|
||||
|
||||
// use function_name::named;
|
||||
#[named]
|
||||
fn parse_var<'a>(
|
||||
word_reader : &mut WordReader,
|
||||
parent_scope_idx : Scope_Idx,
|
||||
vcd : &'a mut VCD,
|
||||
signal_map : &mut HashMap<String, Signal_Idx>
|
||||
) -> Result<(), String> {
|
||||
let err = format!("reached end of file without parser leaving {}", function_name!());
|
||||
let (word, cursor) = word_reader.next_word().ok_or(&err)?;
|
||||
let expected_types = "[integer, parameter, real, reg, string, wire]";
|
||||
|
||||
// $var parameter 3 a IDLE $end
|
||||
// ^^^^^^^^^ - var_type
|
||||
let var_type = match word {
|
||||
"integer" => {Ok(Sig_Type::Integer)}
|
||||
"parameter" => {Ok(Sig_Type::Parameter)}
|
||||
"real" => {Ok(Sig_Type::Real)}
|
||||
"reg" => {Ok(Sig_Type::Reg)}
|
||||
"string" => {Ok(Sig_Type::Str)}
|
||||
"wire" => {Ok(Sig_Type::Wire)}
|
||||
_ => {
|
||||
let err = format!("found keyword `{word}` but expected one of {expected_types} on {cursor:?}");
|
||||
Err(err)
|
||||
}
|
||||
}?;
|
||||
|
||||
let (word, cursor) = word_reader.next_word().ok_or(&err)?;
|
||||
let parse_err = format!("failed to parse as usize on {cursor:?}");
|
||||
|
||||
// $var parameter 3 a IDLE $end
|
||||
// ^ - no_bits
|
||||
let no_bits = match var_type {
|
||||
Sig_Type::Integer | Sig_Type::Parameter |
|
||||
Sig_Type::Real | Sig_Type::Reg |
|
||||
Sig_Type::Wire => {
|
||||
let no_bits = word.parse::<usize>().expect(parse_err.as_str());
|
||||
Some(no_bits)
|
||||
}
|
||||
// for strings, we don't really care what the number of bits is
|
||||
_ => {None}
|
||||
};
|
||||
|
||||
// $var parameter 3 a IDLE $end
|
||||
// ^ - signal_alias
|
||||
let (word, cursor) = word_reader.next_word().ok_or(&err)?;
|
||||
let signal_alias = word.to_string();
|
||||
|
||||
// $var parameter 3 a IDLE $end
|
||||
// ^^^^ - full_signal_name(can extend until $end)
|
||||
let mut full_signal_name = Vec::<String>::new();
|
||||
loop {
|
||||
let (word, cursor) = word_reader.next_word().ok_or(&err)?;
|
||||
match word {
|
||||
"$end" => {break}
|
||||
_ => {full_signal_name.push(word.to_string())}
|
||||
}
|
||||
}
|
||||
let full_signal_name = full_signal_name.join(" ");
|
||||
|
||||
// Is the current variable an alias to a signal already encountered?
|
||||
// if so, handle ref_signal_idx accordingly, if not, add signal to hash
|
||||
// map
|
||||
let (signal, signal_idx) = match signal_map.get(&signal_alias) {
|
||||
Some(ref_signal_idx) => {
|
||||
let signal_idx = Signal_Idx(vcd.all_signals.len());
|
||||
let signal = Signal::Alias{
|
||||
name: full_signal_name,
|
||||
signal_alias: *ref_signal_idx};
|
||||
(signal, signal_idx)
|
||||
}
|
||||
None => {
|
||||
let signal_idx = Signal_Idx(vcd.all_signals.len());
|
||||
signal_map.insert(signal_alias.to_string(), signal_idx);
|
||||
let signal = Signal::Data{
|
||||
name: full_signal_name,
|
||||
sig_type: var_type,
|
||||
num_bits: no_bits,
|
||||
self_idx: signal_idx,
|
||||
timeline: BTreeMap::new(),
|
||||
scope_parent: parent_scope_idx };
|
||||
(signal, signal_idx)
|
||||
}
|
||||
};
|
||||
|
||||
vcd.all_signals.push(signal);
|
||||
let Scope_Idx(parent_scope_idx_usize) = parent_scope_idx;
|
||||
let parent_scope = vcd.all_scopes.get_mut(parent_scope_idx_usize).unwrap();
|
||||
parent_scope.child_signals.push(signal_idx);
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[named]
|
||||
fn parse_signal_tree<'a>(
|
||||
word_reader : &mut WordReader,
|
||||
vcd : &'a mut VCD
|
||||
) -> Result<&'a mut VCD, String> {
|
||||
let err : Result<&'a mut VCD, String> = Err(format!("reached end of file without parser leaving {}", function_name!()));
|
||||
// we assume we've already seen a `$scope` once
|
||||
// by the time we reach this function
|
||||
// let scope_name =
|
||||
loop {
|
||||
let word = word_reader.next_word();
|
||||
word_reader : &mut WordReader,
|
||||
parent_scope_idx : Option<Scope_Idx>,
|
||||
vcd : &'a mut VCD,
|
||||
signal_map : &mut HashMap<String, Signal_Idx>
|
||||
) -> Result<(), String> {
|
||||
|
||||
// if there isn't another word left in the file, then we exit
|
||||
if word.is_none() {
|
||||
return err;
|
||||
// $scope module reg_mag_i $end
|
||||
// ^^^^^^ - module keyword
|
||||
let err = format!("reached end of file without parser leaving {}", function_name!());
|
||||
ident(word_reader, "module")?;
|
||||
|
||||
// $scope module reg_mag_i $end
|
||||
// ^^^^^^^^^ - scope name
|
||||
let (scope_name, _) = word_reader.next_word().ok_or(err)?;
|
||||
|
||||
let curr_scope_idx = Scope_Idx(vcd.all_scopes.len());
|
||||
|
||||
// register this scope as a child of the current parent scope
|
||||
// if there is a parent scope
|
||||
match parent_scope_idx {
|
||||
Some(Scope_Idx(parent_scope_idx)) => {
|
||||
let parent_scope = vcd.all_scopes.get_mut(parent_scope_idx).unwrap();
|
||||
parent_scope.child_scopes.push(curr_scope_idx);
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
|
||||
// add this scope to list of existing scopes
|
||||
vcd.all_scopes.push(
|
||||
Scope {
|
||||
name: scope_name.to_string(),
|
||||
parent_idx: parent_scope_idx,
|
||||
self_idx: curr_scope_idx,
|
||||
child_signals: vec![],
|
||||
child_scopes: vec![]
|
||||
}
|
||||
);
|
||||
|
||||
// $scope module reg_mag_i $end
|
||||
// ^^^^ - end keyword
|
||||
ident(word_reader, "$end")?;
|
||||
|
||||
let err = format!("reached end of file without parser leaving {}", function_name!());
|
||||
loop {
|
||||
let (word, cursor) = word_reader.next_word().ok_or(&err)?;
|
||||
let ParseResult{matched, residual} = tag(word, "$");
|
||||
match matched {
|
||||
// we hope that this word stars with a `$`
|
||||
"$" => {
|
||||
match residual {
|
||||
"scope" => {
|
||||
// recursive - parse inside of current scope tree
|
||||
parse_signal_tree(word_reader, Some(curr_scope_idx), vcd, signal_map);
|
||||
}
|
||||
"var" => {
|
||||
parse_var(word_reader, curr_scope_idx, vcd, signal_map)?;
|
||||
}
|
||||
"upscope" => {
|
||||
ident(word_reader, "$end")?;
|
||||
break
|
||||
}
|
||||
_ => {
|
||||
let err = format!("found keyword `{residual}` but expected `$scope`, `$var`, or `$upscope` on {cursor:?}");
|
||||
return Err(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
_ => {
|
||||
let err = format!("found keyword `{matched}` but expected `$` on {cursor:?}");
|
||||
return Err(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(vcd)
|
||||
|
||||
// TODO : remove the following Ok(()) once we add loop above
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// #[named]
|
||||
// fn parse_signal_tree_outer<'a>(
|
||||
// word_reader : &mut WordReader,
|
||||
// vcd : &'a mut VCD,
|
||||
// signal_map : &mut HashMap<String, Signal_Idx>
|
||||
// ) -> Result<(), String> {
|
||||
// // We assume we've already seen a `$scope` once by the time we reach this function,
|
||||
// // that why its call `parse_signal_tree_outer` and not just `parse_signal_tree`.
|
||||
// // If our WordReader had a `putback` function, we wouldn't need to have a
|
||||
// // `parse_signal_tree_outer`.
|
||||
|
||||
pub fn parse_vcd(file : File) {
|
||||
// // the current scope is the parent scope
|
||||
|
||||
// // $scope module reg_mag_i $end
|
||||
// // ^^^^^^ - module keyword
|
||||
// let err = format!("reached end of file without parser leaving {}", function_name!());
|
||||
// ident(word_reader, "module")?;
|
||||
|
||||
// // $scope module reg_mag_i $end
|
||||
// // ^^^^^^^^^ - scope name
|
||||
// let (scope_name, _) = word_reader.next_word().ok_or(err)?;
|
||||
|
||||
// let curr_scope_idx = Scope_Idx(vcd.all_scopes.len());
|
||||
|
||||
// // register this scope as a child of the current parent scope
|
||||
// let Scope_Idx(parent_scope_idx_usize) = parent_scope_idx;
|
||||
// let parent_scope = vcd.all_scopes.get_mut(parent_scope_idx_usize).unwrap();
|
||||
// parent_scope.child_scopes.push(curr_scope_idx);
|
||||
|
||||
// vcd.all_scopes.push(
|
||||
// Scope {
|
||||
// name: scope_name.to_string(),
|
||||
// parent_idx: parent_scope_idx,
|
||||
// self_idx: curr_scope_idx,
|
||||
// child_signals: vec![],
|
||||
// child_scopes: vec![]
|
||||
// }
|
||||
// );
|
||||
|
||||
// // $scope module reg_mag_i $end
|
||||
// // ^^^^ - end keyword
|
||||
// ident(word_reader, "$end")?;
|
||||
|
||||
// // recursive - parse inside of current scope tree
|
||||
// parse_signal_tree(word_reader, curr_scope_idx, vcd, signal_map);
|
||||
|
||||
// // ascend from parsing inside of current scope tree, expect $upscope $end
|
||||
// ident(word_reader, "$upscope")?;
|
||||
// ident(word_reader, "$end")?;
|
||||
|
||||
// Ok(())
|
||||
// }
|
||||
|
||||
|
||||
pub fn parse_vcd(file : File) -> Result<(), String> {
|
||||
let mut word_gen = WordReader::new(file);
|
||||
|
||||
let header = parse_metadata(&mut word_gen).unwrap();
|
||||
let header = parse_metadata(&mut word_gen)?;
|
||||
dbg!(&header);
|
||||
|
||||
// let (word, cursor) = word_gen.next_word().unwrap();
|
||||
// cursor.error(word).unwrap();
|
||||
let mut signal_map = std::collections::HashMap::new();
|
||||
|
||||
let mut vcd = VCD{
|
||||
metadata: header,
|
||||
all_signals: vec![],
|
||||
all_scopes: vec![]
|
||||
all_scopes: vec![],
|
||||
};
|
||||
|
||||
parse_signal_tree(&mut word_gen, None, &mut vcd, &mut signal_map)?;
|
||||
dbg!(&vcd.all_scopes);
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
use super::types::ParseResult;
|
||||
use super::reader::WordReader;
|
||||
|
||||
pub(super) fn digit(chr : u8) -> bool {
|
||||
let zero = b'0' as u8;
|
||||
|
@ -82,3 +83,22 @@ pub(super) fn tag<'a>(word : &'a str, pattern : &'a str) -> ParseResult<'a> {
|
|||
residual : &word[new_start..]
|
||||
};
|
||||
}
|
||||
|
||||
pub(super) fn ident(
|
||||
word_reader : &mut WordReader,
|
||||
keyword : &str,
|
||||
) -> Result<(), String> {
|
||||
// let keyword = "module";
|
||||
|
||||
let err : Result<(), String> = Err(format!("reached end of file without parser leaving ident"));
|
||||
let word = word_reader.next_word();
|
||||
let (word, cursor) = word.ok_or(err).unwrap();
|
||||
|
||||
if word == keyword {
|
||||
return Ok(())
|
||||
}
|
||||
else {
|
||||
let err = format!("found keyword `{word}` but expected `{keyword}` on {cursor:?}");
|
||||
return Err(err)
|
||||
}
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
use std::collections::BTreeMap;
|
||||
use std::collections::{BTreeMap, HashMap};
|
||||
use chrono::prelude::*;
|
||||
use num::BigInt;
|
||||
|
||||
|
@ -14,46 +14,49 @@ pub(super) struct Metadata {
|
|||
pub(super) version : Option<Version>,
|
||||
pub(super) timescale : (Option<u32>, Timescale)}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Scope_Idx(usize);
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub(super) struct Scope_Idx(pub(super) usize);
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub(super) struct Signal_Idx(pub(super) usize);
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Signal_Idx(usize);
|
||||
pub(super) enum Sig_Type {Integer, Parameter, Real, Reg, Str, Wire,}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum SignalGeneric{
|
||||
Signal{
|
||||
name : String,
|
||||
timeline : BTreeMap<BigInt, BigInt>,
|
||||
scope_parent : Scope_Idx},
|
||||
SignalAlias{
|
||||
name : String,
|
||||
signal_alias : Signal_Idx}
|
||||
pub(super) enum Sig_Value {
|
||||
Numeric(BigInt),
|
||||
NonNumeric(String)}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) enum Signal{
|
||||
Data{
|
||||
name : String,
|
||||
sig_type : Sig_Type,
|
||||
num_bits : Option<usize>,
|
||||
// TODO : may be able to remove self_idx
|
||||
self_idx : Signal_Idx,
|
||||
timeline : BTreeMap<BigInt, Sig_Value>,
|
||||
scope_parent : Scope_Idx},
|
||||
Alias{
|
||||
name : String,
|
||||
signal_alias : Signal_Idx}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub(super) struct Scope {
|
||||
name : String,
|
||||
child_signals : Vec<Signal_Idx>,
|
||||
child_scopes : Vec<Scope_Idx>}
|
||||
pub(super) name : String,
|
||||
|
||||
pub(super) parent_idx : Option<Scope_Idx>,
|
||||
// TODO : may be able to remove self_idx
|
||||
pub(super) self_idx : Scope_Idx,
|
||||
|
||||
pub(super) child_signals : Vec<Signal_Idx>,
|
||||
pub(super) child_scopes : Vec<Scope_Idx>}
|
||||
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct VCD {
|
||||
pub(super) metadata : Metadata,
|
||||
pub(super) all_signals : Vec<SignalGeneric>,
|
||||
// the root scope should always be placed at index 0
|
||||
pub(super) all_scopes : Vec<Scope>}
|
||||
|
||||
impl VCD {
|
||||
pub fn new() -> Self {
|
||||
let metadata = Metadata {
|
||||
date : None,
|
||||
version : None,
|
||||
timescale : (None, Timescale::unit)};
|
||||
VCD {
|
||||
metadata : metadata,
|
||||
all_signals : Vec::<SignalGeneric>::new(),
|
||||
all_scopes : Vec::<Scope>::new()}
|
||||
}
|
||||
}
|
||||
pub(super) all_signals : Vec<Signal>,
|
||||
pub(super) all_scopes : Vec<Scope>}
|
287
test-vcd-files/amaranth/up_counter.vcd
Normal file
287
test-vcd-files/amaranth/up_counter.vcd
Normal file
|
@ -0,0 +1,287 @@
|
|||
$comment Generated by Amaranth $end
|
||||
$date 2022-07-13 18:48:57.685239 $end
|
||||
$timescale 1 ps $end
|
||||
$scope module bench $end
|
||||
$scope module top $end
|
||||
$var wire 1 ! clk $end
|
||||
$var wire 1 " rst $end
|
||||
$var wire 1 # ovf $end
|
||||
$var wire 16 $ count $end
|
||||
$var string 1 % state $end
|
||||
$var wire 1 & en $end
|
||||
$upscope $end
|
||||
$upscope $end
|
||||
$enddefinitions $end
|
||||
#0
|
||||
$dumpvars
|
||||
0!
|
||||
0"
|
||||
0#
|
||||
b0 $
|
||||
sTOP/0 %
|
||||
0&
|
||||
$end
|
||||
#500000
|
||||
1!
|
||||
#1000000
|
||||
0!
|
||||
#1500000
|
||||
1!
|
||||
#2000000
|
||||
0!
|
||||
#2500000
|
||||
1!
|
||||
#3000000
|
||||
0!
|
||||
#3500000
|
||||
1!
|
||||
#4000000
|
||||
0!
|
||||
#4500000
|
||||
1!
|
||||
#5000000
|
||||
0!
|
||||
#5500000
|
||||
1!
|
||||
#6000000
|
||||
0!
|
||||
#6500000
|
||||
1!
|
||||
#7000000
|
||||
0!
|
||||
#7500000
|
||||
1!
|
||||
#8000000
|
||||
0!
|
||||
#8500000
|
||||
1!
|
||||
#9000000
|
||||
0!
|
||||
#9500000
|
||||
1!
|
||||
#10000000
|
||||
0!
|
||||
#10500000
|
||||
1!
|
||||
#11000000
|
||||
0!
|
||||
#11500000
|
||||
1!
|
||||
#12000000
|
||||
0!
|
||||
#12500000
|
||||
1!
|
||||
#13000000
|
||||
0!
|
||||
#13500000
|
||||
1!
|
||||
#14000000
|
||||
0!
|
||||
#14500000
|
||||
1!
|
||||
#15000000
|
||||
0!
|
||||
#15500000
|
||||
1!
|
||||
#16000000
|
||||
0!
|
||||
#16500000
|
||||
1!
|
||||
#17000000
|
||||
0!
|
||||
#17500000
|
||||
1!
|
||||
#18000000
|
||||
0!
|
||||
#18500000
|
||||
1!
|
||||
#19000000
|
||||
0!
|
||||
#19500000
|
||||
1!
|
||||
#20000000
|
||||
0!
|
||||
#20500000
|
||||
1!
|
||||
#21000000
|
||||
0!
|
||||
#21500000
|
||||
1!
|
||||
#22000000
|
||||
0!
|
||||
#22500000
|
||||
1!
|
||||
#23000000
|
||||
0!
|
||||
#23500000
|
||||
1!
|
||||
#24000000
|
||||
0!
|
||||
#24500000
|
||||
1!
|
||||
#25000000
|
||||
0!
|
||||
#25500000
|
||||
1!
|
||||
#26000000
|
||||
0!
|
||||
#26500000
|
||||
1!
|
||||
#27000000
|
||||
0!
|
||||
#27500000
|
||||
1!
|
||||
#28000000
|
||||
0!
|
||||
#28500000
|
||||
1!
|
||||
#29000000
|
||||
0!
|
||||
#29500000
|
||||
1!
|
||||
#30000000
|
||||
0!
|
||||
#30500000
|
||||
1&
|
||||
1!
|
||||
#31000000
|
||||
0!
|
||||
#31500000
|
||||
sBOTTOM/2 %
|
||||
b1 $
|
||||
1!
|
||||
#32000000
|
||||
0!
|
||||
#32500000
|
||||
b10 $
|
||||
1!
|
||||
#33000000
|
||||
0!
|
||||
#33500000
|
||||
b11 $
|
||||
1!
|
||||
#34000000
|
||||
0!
|
||||
#34500000
|
||||
b100 $
|
||||
1!
|
||||
#35000000
|
||||
0!
|
||||
#35500000
|
||||
b101 $
|
||||
1!
|
||||
#36000000
|
||||
0!
|
||||
#36500000
|
||||
b110 $
|
||||
1!
|
||||
#37000000
|
||||
0!
|
||||
#37500000
|
||||
b111 $
|
||||
1!
|
||||
#38000000
|
||||
0!
|
||||
#38500000
|
||||
b1000 $
|
||||
1!
|
||||
#39000000
|
||||
0!
|
||||
#39500000
|
||||
b1001 $
|
||||
1!
|
||||
#40000000
|
||||
0!
|
||||
#40500000
|
||||
b1010 $
|
||||
1!
|
||||
#41000000
|
||||
0!
|
||||
#41500000
|
||||
b1011 $
|
||||
1!
|
||||
#42000000
|
||||
0!
|
||||
#42500000
|
||||
b1100 $
|
||||
1!
|
||||
#43000000
|
||||
0!
|
||||
#43500000
|
||||
b1101 $
|
||||
1!
|
||||
#44000000
|
||||
0!
|
||||
#44500000
|
||||
b1110 $
|
||||
1!
|
||||
#45000000
|
||||
0!
|
||||
#45500000
|
||||
b1111 $
|
||||
1!
|
||||
#46000000
|
||||
0!
|
||||
#46500000
|
||||
b10000 $
|
||||
1!
|
||||
#47000000
|
||||
0!
|
||||
#47500000
|
||||
b10001 $
|
||||
1!
|
||||
#48000000
|
||||
0!
|
||||
#48500000
|
||||
b10010 $
|
||||
1!
|
||||
#49000000
|
||||
0!
|
||||
#49500000
|
||||
b10011 $
|
||||
1!
|
||||
#50000000
|
||||
0!
|
||||
#50500000
|
||||
b10100 $
|
||||
1!
|
||||
#51000000
|
||||
0!
|
||||
#51500000
|
||||
b10101 $
|
||||
1!
|
||||
#52000000
|
||||
0!
|
||||
#52500000
|
||||
b10110 $
|
||||
1!
|
||||
#53000000
|
||||
0!
|
||||
#53500000
|
||||
b10111 $
|
||||
1!
|
||||
#54000000
|
||||
0!
|
||||
#54500000
|
||||
b11000 $
|
||||
1!
|
||||
#55000000
|
||||
0!
|
||||
#55500000
|
||||
1#
|
||||
b11001 $
|
||||
1!
|
||||
#56000000
|
||||
0!
|
||||
#56500000
|
||||
sTOP/0 %
|
||||
0#
|
||||
b0 $
|
||||
1!
|
||||
#57000000
|
||||
0!
|
||||
#57500000
|
||||
sBOTTOM/2 %
|
||||
b1 $
|
||||
1!
|
||||
#58000000
|
|
@ -1,4 +1,4 @@
|
|||
Icarus,Verilator,GHDL,VCS,QuestaSim,ModelSim,Quartus,SystemC,Treadle,Aldec,Riviera-PRO,MyHDL,ncsim,xilinx_isim,vivado,GTKWave-Analyzer
|
||||
https://github.com/dpretet/vcd/blob/master/test1.vcd,https://github.com/wavedrom/vcd-samples/blob/trunk/swerv1.vcd,https://raw.githubusercontent.com/AdoobII/idea_21s/main/vhdl/idea.vcd,https://raw.githubusercontent.com/ameyjain/8-bit-Microprocessor/master/8-bit%20microprocessor/processor.vcd,https://github.com/mr-gaurav/Sequence-Counter/blob/main/test.vcd,https://github.com/Mohammad-Heydariii/Digital-Systems-Lab-Course/blob/main/Lab_project4/modelsim_files/clkdiv2n_tb.vcd,https://github.com/PedroTLemos/ProjetoInfraHard/blob/master/mipsHardware.vcd,https://github.com/jroslindo/Mips-Systemc/blob/main/REGISTRADORES_32_bits/wave_registradores.vcd,https://github.com/chipsalliance/treadle/blob/master/src/test/resources/GCD.vcd,https://github.com/SVeilleux9/FPGA-GPIO-Extender/blob/main/Firmware/aldec/SPI_Write/SPI_Write.vcd,https://github.com/prathampathak/Tic-Tac-Tao/blob/main/dump.vcd,https://github.com/aibtw/myHdl_Projects/blob/main/SimpleMemory/Simple_Memory.vcd,https://github.com/amiteee78/RTL_design/blob/master/ffdiv_32bit/ffdiv_32bit_prop_binom/run_cad/ffdiv_32bit_tb.vcd,https://github.com/mukul54/qrs-peak-fpga/blob/master/utkarsh/utkarsh.sim/sim_1/behav/xsim/test.vcd,https://github.com/saharmalmir/Eth2Ser/blob/master/UART2ETH.runs/impl_1/iladata.vcd,https://github.com/Asfagus/Network-Switch/blob/main/perm_current.vcd
|
||||
https://github.com/ombhilare999/riscv-core/blob/master/src/rv32_soc_TB.vcd,https://github.com/bigBrain1901/nPOWER-ISA-5-STAGE-PIPELINED-CPU/blob/master/post_compile_files/vlt_dump.vcd,https://github.com/gaoqqt2n/CPU/blob/master/SuperPipelineCPU/vcdfile/pcpu.vcd,https://raw.githubusercontent.com/Akashay-Singla/RISC-V/main/Pipeline/datapath_log.vcd,https://github.com/SparshAgarwal/Computer-Architecture/blob/master/hw3/hw3_1/dump.vcd,https://github.com/sh619/Songyu_Huang-Chisel/blob/main/MU0_final_version/simulation/qsim/CPU_Design.msim.vcd,,https://github.com/amrhas/PDRNoC/blob/VCRouter/noctweak/Debug/waveform.vcd.vcd,,,,https://github.com/Abhishek010397/Programming-RISC-V/blob/master/top.vcd,,https://github.com/DanieleParravicini/regex_coprocessor/blob/master/scripts/sim/test2x2_regex22_string1.vcd,https://github.com/BradMcDanel/multiplication-free-dnn/blob/master/verilog/iladata.vcd,
|
||||
https://github.com/b06902044/computer_architecture/blob/main/CPU.vcd,,https://github.com/charlycop/VLSI-1/blob/master/EXEC/ALU/alu.vcd,https://raw.githubusercontent.com/sathyapriyanka/APB_UVC_UVM/main/Apb_slave_uvm_new.vcd,,,,,,,,https://github.com/DarthSkipper/myHDL_Sigmoid/blob/master/out/testbench/sigmoid_tb.vcd,,https://github.com/pabloec1729/Hashes-generator/blob/master/RTL/velocidad/test.vcd,,
|
||||
Icarus,Verilator,GHDL,VCS,QuestaSim,ModelSim,Quartus,SystemC,Treadle,Aldec,Riviera-PRO,MyHDL,ncsim,xilinx_isim,vivado,GTKWave-Analyzer,Amaranth
|
||||
https://github.com/dpretet/vcd/blob/master/test1.vcd,https://github.com/wavedrom/vcd-samples/blob/trunk/swerv1.vcd,https://raw.githubusercontent.com/AdoobII/idea_21s/main/vhdl/idea.vcd,https://raw.githubusercontent.com/ameyjain/8-bit-Microprocessor/master/8-bit%20microprocessor/processor.vcd,https://github.com/mr-gaurav/Sequence-Counter/blob/main/test.vcd,https://github.com/Mohammad-Heydariii/Digital-Systems-Lab-Course/blob/main/Lab_project4/modelsim_files/clkdiv2n_tb.vcd,https://github.com/PedroTLemos/ProjetoInfraHard/blob/master/mipsHardware.vcd,https://github.com/jroslindo/Mips-Systemc/blob/main/REGISTRADORES_32_bits/wave_registradores.vcd,https://github.com/chipsalliance/treadle/blob/master/src/test/resources/GCD.vcd,https://github.com/SVeilleux9/FPGA-GPIO-Extender/blob/main/Firmware/aldec/SPI_Write/SPI_Write.vcd,https://github.com/prathampathak/Tic-Tac-Tao/blob/main/dump.vcd,https://github.com/aibtw/myHdl_Projects/blob/main/SimpleMemory/Simple_Memory.vcd,https://github.com/amiteee78/RTL_design/blob/master/ffdiv_32bit/ffdiv_32bit_prop_binom/run_cad/ffdiv_32bit_tb.vcd,https://github.com/mukul54/qrs-peak-fpga/blob/master/utkarsh/utkarsh.sim/sim_1/behav/xsim/test.vcd,https://github.com/saharmalmir/Eth2Ser/blob/master/UART2ETH.runs/impl_1/iladata.vcd,https://github.com/Asfagus/Network-Switch/blob/main/perm_current.vcd,Locally Simulated File
|
||||
https://github.com/ombhilare999/riscv-core/blob/master/src/rv32_soc_TB.vcd,https://github.com/bigBrain1901/nPOWER-ISA-5-STAGE-PIPELINED-CPU/blob/master/post_compile_files/vlt_dump.vcd,https://github.com/gaoqqt2n/CPU/blob/master/SuperPipelineCPU/vcdfile/pcpu.vcd,https://raw.githubusercontent.com/Akashay-Singla/RISC-V/main/Pipeline/datapath_log.vcd,https://github.com/SparshAgarwal/Computer-Architecture/blob/master/hw3/hw3_1/dump.vcd,https://github.com/sh619/Songyu_Huang-Chisel/blob/main/MU0_final_version/simulation/qsim/CPU_Design.msim.vcd,,https://github.com/amrhas/PDRNoC/blob/VCRouter/noctweak/Debug/waveform.vcd.vcd,,,,https://github.com/Abhishek010397/Programming-RISC-V/blob/master/top.vcd,,https://github.com/DanieleParravicini/regex_coprocessor/blob/master/scripts/sim/test2x2_regex22_string1.vcd,https://github.com/BradMcDanel/multiplication-free-dnn/blob/master/verilog/iladata.vcd,,
|
||||
https://github.com/b06902044/computer_architecture/blob/main/CPU.vcd,,https://github.com/charlycop/VLSI-1/blob/master/EXEC/ALU/alu.vcd,https://raw.githubusercontent.com/sathyapriyanka/APB_UVC_UVM/main/Apb_slave_uvm_new.vcd,,,,,,,,https://github.com/DarthSkipper/myHDL_Sigmoid/blob/master/out/testbench/sigmoid_tb.vcd,,https://github.com/pabloec1729/Hashes-generator/blob/master/RTL/velocidad/test.vcd,,,
|
||||
|
|
|
Loading…
Reference in a new issue