rust_hdl_core/
constraint.rs1#![allow(non_camel_case_types)]
2
3#[derive(Clone, Debug)]
4pub enum SignalType {
5 LowVoltageCMOS_1v8,
6 LowVoltageCMOS_3v3,
7 StubSeriesTerminatedLogic_II,
8 DifferentialStubSeriesTerminatedLogic_II,
9 StubSeriesTerminatedLogic_II_No_Termination,
10 DifferentialStubSeriesTerminatedLogic_II_No_Termination,
11 LowVoltageDifferentialSignal_2v5,
12 StubSeriesTerminatedLogic_1v5,
13 LowVoltageCMOS_1v5,
14 DifferentialStubSeriesTerminatedLogic_1v5,
15 Custom(String),
16}
17
18#[derive(Clone, Debug)]
19pub struct PeriodicTiming {
20 pub net: String,
21 pub period_nanoseconds: f64,
22 pub duty_cycle: f64,
23}
24
25#[derive(Clone, Copy, Debug)]
26pub enum TimingRelative {
27 Before,
28 After,
29}
30
31impl ToString for TimingRelative {
32 fn to_string(&self) -> String {
33 match self {
34 TimingRelative::Before => "BEFORE",
35 TimingRelative::After => "AFTER",
36 }
37 .into()
38 }
39}
40
41#[derive(Clone, Debug)]
42pub struct FalsePathRegexp {
43 pub from_regexp: String,
44 pub to_regexp: String,
45}
46
47#[derive(Clone, Copy, Debug)]
48pub enum TimingRelativeEdge {
49 Rising,
50 Falling,
51}
52
53impl ToString for TimingRelativeEdge {
54 fn to_string(&self) -> String {
55 match self {
56 TimingRelativeEdge::Falling => "FALLING",
57 TimingRelativeEdge::Rising => "RISING",
58 }
59 .into()
60 }
61}
62
63#[derive(Clone, Debug)]
64pub struct VivadoInputTimingConstraint {
65 pub min_nanoseconds: f64,
66 pub max_nanoseconds: f64,
67 pub multicycle: usize,
68 pub clock: String,
69}
70
71#[derive(Clone, Debug)]
72pub struct VivadoOutputTimingConstraint {
73 pub delay_nanoseconds: f64,
74 pub clock: String,
75}
76
77#[derive(Clone, Copy, Debug)]
78pub struct InputTimingConstraint {
79 pub offset_nanoseconds: f64,
80 pub valid_duration_nanoseconds: f64,
81 pub relative: TimingRelative,
82 pub edge_sense: TimingRelativeEdge,
83 pub to_signal_id: usize,
84 pub to_signal_bit: Option<usize>,
85}
86
87#[derive(Clone, Copy, Debug)]
88pub struct OutputTimingConstraint {
89 pub offset_nanoseconds: f64,
90 pub relative: TimingRelative,
91 pub edge_sense: TimingRelativeEdge,
92 pub to_signal_id: usize,
93 pub to_signal_bit: Option<usize>,
94}
95
96#[derive(Clone, Debug)]
97pub enum Timing {
98 Periodic(PeriodicTiming),
99 InputTiming(InputTimingConstraint),
100 OutputTiming(OutputTimingConstraint),
101 VivadoInputTiming(VivadoInputTimingConstraint),
102 VivadoOutputTiming(VivadoOutputTimingConstraint),
103 VivadoClockGroup(Vec<Vec<String>>),
104 VivadoFalsePath(FalsePathRegexp),
105 Custom(String),
106}
107
108#[derive(Clone, Debug)]
109pub enum Constraint {
110 Location(String),
111 Kind(SignalType),
112 Timing(Timing),
113 Custom(String),
114 Slew(SlewType),
115}
116
117#[derive(Clone, Debug)]
118pub enum SlewType {
119 Normal,
120 Fast,
121}
122
123#[derive(Clone, Debug)]
124pub struct PinConstraint {
125 pub index: usize,
126 pub constraint: Constraint,
127}