jitx/ref¶
Package name: jitx/ref
Summary¶
Data Types¶
FieldRef¶
IndexRef¶
Ref¶
Functions¶
Function | Description |
---|---|
ref-length | Count the length of a Ref. |
tail | Return the tail of some reference by removing |
base | Extract the first l components of some Ref |
Ref | Convenience Ref constructor. Only generates VarRef objects; cannot |
get | get enables the construction of Ref values via array-access syntax. |
dot (+ 1) | dot enables the construction of Ref values via "dot" syntax. |
remove-base | Removes the "base" of a Ref |
prefix? | A predicate for checking whether or not a Ref r has |
VarRef¶
Definitions¶
FieldRef¶
public defstruct FieldRef <: Ref :
field: VarRef
ref: Ref
-
field: VarRef
- AVarRef
containing the name of the field. -
ref: Ref
- The base Ref of the JITX object.
Constructors¶
FieldRef¶
Constructor for defstruct FieldRef
public defn FieldRef (ref:Ref, field:VarRef)
IndexRef¶
public defstruct IndexRef <: Ref :
index: Int
ref: Ref
-
index: Int
- An integer array index. -
ref: Ref
- The base Ref of the array of JITX objects.
Constructors¶
IndexRef¶
Constructor for defstruct IndexRef
public defn IndexRef (ref:Ref, index:Int)
Ref¶
public deftype Ref <: Hashable & Equalable & Comparable<Ref>
The Ref
data structure represents a reference to
a JITX object in a hierarchical design.
Ports, instances, pads, and nets can all have a Ref, which represents the object's location within the design hierarchy. Note that its possible to create nameless nets, in which case the net object will not have an associated Ref.
There are three kinds of Ref corresponding to the three
ways to reference an object in a design:
* VarRef
: a named object
* FieldRef
: a named field in another object. For example hdmi.clk
* IndexRef
: a member of an array of objects, referenced by its index.
For example, p[2]
.
The syntax #R(cpu.p[50])
constructs Ref
values via the usual "dot" and "bracket"
syntax for accessing JITX objects. Ref
values correspond directly with
accesses to an object within the hierarchy of pins, bundles, and instances.
pcb-component cpu :
port p : pin[50]
pcb-component capacitor :
port a
port b
pcb-module my-module :
inst proc : cpu
inst cap : capacitor
; Prints "proc" -- This is a `VarRef` value
println(ref(proc))
; Prints "cap.p" -- This is a `FieldRef` value
println(ref(cap.a))
; Prints "proc.p[0]", "proc.p[1]", ...
; Each one is an `IndexRef` value
for p in pins(proc) :
println(ref(p))
Functions¶
ref-length¶
Count the length of a Ref.
public defn ref-length (r:Ref)
The length of a Ref is the number of "accesses".
public pcb-bundle wide-spi (width:Int):
port sck
port data : pin[width]
pcb-component demo :
port spi : wide-spi(4)
; Prints 3
println(ref-length(ref(spi.data[0])))
tail¶
Return the tail of some reference by removing
public defn tail (r:Ref, l:Int)
r: Ref
- a Refl: Int
- an integer, with l < ref-length®
the first l components.
public pcb-bundle wide-spi (width:Int):
port sck
port data : pin[width]
pcb-component demo :
port spi : wide-spi(4)
; Prints "data[3]"
println(tail(ref(spi.data[3]), 1))
base¶
Extract the first l components of some Ref
public defn base (r:Ref, l:Int)
r: Ref
- any Refl: Int
- an integer, with l <= ref-length®
public pcb-bundle wide-spi (width:Int):
port sck
port data : pin[width]
pcb-component demo :
port spi : wide-spi(4)
; Prints "spi.data"
println(base(ref(spi.data[3]), 2))
Ref¶
Convenience Ref constructor. Only generates VarRef
objects; cannot
public defn Ref (x)
be used to construct references to arrays or object members.
pcb-component cpu :
port p[50]
; This returns false:
; `Ref(x)` can only produce `VarRef` objects
any?(fn (x) : ref(x) == Ref("p[30]"), pins(self))
; This returns true:
; We compare the `Ref` of each pin against a custom `IndexRef`
any?(fn (x) : ref(x) == #R(p[30]), pins(self))
get¶
get
enables the construction of Ref
values via array-access syntax.
public defn get (r1:Ref, i:Int)
r1: Ref
- the "base" Refi: Int
- the integer index
get(r, i)
constructs an IndexRef
at index i
.
dot¶
dot
enables the construction of Ref
values via "dot" syntax.
public defn dot (r1:Ref, r2:Ref)
r1: Ref
- the "base" Refr2: Ref
- the "field" Ref
dot(r1, r2)
essentially appends r2
to r1
.
For example, dot(#R(mod.cpu), #R(p[50]))
yields #R(mod.cpu.p[50])
dot¶
public defn dot (f:False, r:Ref)
remove-base¶
Removes the "base" of a Ref
public defn remove-base (r:Ref, b:Ref)
r: Ref
- any Refb: Ref
- another Ref, where b is a prefix of r
public pcb-bundle wide-spi (width:Int):
port sck
port data : pin[width]
pcb-component demo :
port spi : wide-spi(4)
; Prints "data[3]"
println(remove-base(ref(spi.data[3]), #R(spi)))
prefix?¶
A predicate for checking whether or not a Ref r
has
public defn prefix? (r:Ref, prefix:Ref) -> True|False
r: Ref
- a Refprefix: Ref
- the possible prefix- Returns
True|False
a given prefix.
; returns true
prefix?(#R(cpu.p[5]), #R(cpu.p))
; returns false
prefix?(#R(cpu.p[5]), #R(p[5]))
VarRef¶
public defstruct VarRef <: Ref :
name: Symbol
name: Symbol
- The name of the JITX Object.
Related Packages¶
Forwarded by package: jitx