/*
* Jazz library for PamDC: base definitions.
* Patrice Bertin <Patrice.Bertin@cma.ensmp.fr>
* CMA-Paris, Ecole des Mines de Paris
*/
package jazz.circuit.pam;
import jazz.circuit.*;
/******************************************************************************
*
* Extern devices
*
*****************************************************************************/
/*
* Multiple-source bus.
*/
public extern device Bus {
// number of inputs
public n: int;
// data in
public input in: Net[n];
// output disable
public input disable: Net[n];
// data output
public output out: Net;
public pullup(): ();
public pulldown(): ();
public weakKeeper(): ();
public openDrain(): ();
@ Device.setName("PamDC_Bus");
}
pullup@Bus() = () {
@ pragma("PamDC_pullup", "%n", out);
}
pulldown@Bus() = () {
@ pragma("PamDC_pulldown", "%n", out);
}
weakKeeper@Bus() = () {
@ pragma("PamDC_weakKeeper", "%n", out);
}
openDrain@Bus() = () {
@ pragma("PamDC_openDrain", "%n", out);
}
/*
* 16- or 32-bit asynchronous RAM block
*/
public extern device RAM {
// number of address bits - must be 4 or 5
public naddr: int;
// address input
public input addr: Net[naddr];
// data input
public input in: Net;
// write enable
public input write: Net;
// data output
public output out: Net;
@ Device.setName("PamDC_RAM");
assert(naddr == 4 || naddr == 5);
}
/*
* 16- or 32-bit ROM block
*/
public extern device ROM {
// number of address bits - must be 4 or 5
public naddr: int;
// content
public init: int;
// address input
public input addr: Net[naddr];
// data output
public output out: Net;
@ Device.setName("PamDC_ROM");
@ Device.setParams(format("init=%d", init));
assert(naddr == 4 || naddr == 5);
assert(init >= 0 && init < 2**naddr);
}
/*
* 16- or 32-bit synchronous RAM block
*/
public extern device RAMS {
// number of address bits - must be 4 or 5
public naddr: int;
// initial value
public init: int;
// address input
public input addr: Net[naddr];
// data input
public input in: Net;
// write enable
public input write: Net;
// TEMPORARY: what about clock?
// data output
public output out: Net;
@ Device.setName("PamDC_RAMS");
@ Device.setParams(format("init=%d", init));
assert(naddr == 4 || naddr == 5);
assert(init >= 0 && init < 2**naddr);
}
/*
* 16-bit dual-ported synchronous RAM block
*/
public extern device RAMD {
public init: int; // initial value
public input a: Net[4]; // write, and 1st port read address
public input dpra: Net[4]; // 2nd port read address
public input in: Net; // data input
public input write: Net; // write enable
// TEMPORARY: what about clock?
public output spo: Net; // 1st port output
public output dpo: Net; // 2nd port output
@ Device.setName("PamDC_RAMD");
@ Device.setParams(format("init=%d", init));
assert(init >= 0 && init < 2**4);
}
/*
* Input and output pads.
*/
public extern device InputPad {
public output o: Net;
@ Device.setName("PamDC_InputPad");
}
public extern device OutputPad {
public input i: Net;
@ Device.setName("PamDC_OutputPad");
}
/*
* Mode pins
*/
public extern device Md0Pad {
public output o: Net;
@ Device.setName("PamDC_Md0Pad");
}
public extern device Md1Pad {
public input i: Net;
public input t: Net;
@ Device.setName("PamDC_Md1Pad");
}
public extern device Md2Pad {
public output o: Net;
@ Device.setName("PamDC_Md2Pad");
}
/*
* Readback block.
*/
public extern device Rdbk {
public input trig: Net;
public output data: Net;
public output rip: Net;
@ Device.setName("PamDC_Rdbk");
}
/******************************************************************************
*
* Base class for chip-level devices
*
*****************************************************************************/
public abstract device Chip {
public filename: String;
// Chip type -- mandatory (no default).
public part(): String;
public pkg(): String;
public speedGrade(): int;
// Default clock period. Default is 0 (meaning no constraint).
public defaultClockPeriod(): int;
@ pragma("PamDC_Chip", "%b %s %s %s %d %d",
filename, part(), pkg(), speedGrade(), defaultClockPeriod());
}
defaultClockPeriod@Chip() = 0;
/******************************************************************************
*
* Static functions
*
*****************************************************************************/
public class PamDC {
// Assign an IOB to a net
public static assignIOB(n: Net, pin: int): ();
// Declare an IOB to be input-only
public static assignIOBInput(pin: int): ();
// Absolute placement directive
public static loc(n: Net, x: int, y: int): ();
// Relative placement directive
public static rloc(n: Net, n': Net, x: int, y: int): ();
// horizontal placement of an internal tri-state bus
// "n" is the tri-state bus, "pos" is one of UPPER, LOWER, UNPLACED,
// "row" is desired row, or -2 if none.
public static busLoc(n: Net, pos: int, row: int): ();
public static UPPER: int = 0;
public static LOWER: int = 1;
public static UNPLACED: int = 2;
// vertical placement of a tri-state buffer
// "n" is the tri-state bus, "disable" is the disable input to the buffer
public static busDisableLoc(n: Net, disable: Net, column: int): ();
// placement of a global buffer
public static globalBuffer(n: Net, place: int): ();
public static ACLK: int = 0;
public static GCLK: int = 1;
public static BUFGS: int = 2;
public static BUFGP: int = 3;
public static BUFG: int = 4;
// set the default clock -- TEMPORARY?
public static setDefaultClock(n: Net): ();
}
PamDC.assignIOB(n, pin) = ()
{
@ pragma("PamDC_assignIOB", "%n %d", n, pin);
}
PamDC.assignIOBInput(pin) = ()
{
@ pragma("PamDC_assignIOBInput", "%d", pin);
}
PamDC.loc(n, x, y) = ()
{
@ pragma("PamDC_loc", "%n %d %d", n, x, y);
}
PamDC.rloc(n, n', x, y) = ()
{
@ pragma("PamDC_rloc", "%n %n %d %d", n, n', x, y);
}
PamDC.busLoc(n, pos, row) = ()
{
@ pragma("PamDC_busLoc", "%n %d %d", n, pos, row);
}
PamDC.busDisableLoc(n, disable, column) = ()
{
@ pragma("PamDC_busDisableLoc", "%n %n %d", n, disable, column);
}
PamDC.globalBuffer(n, place) = ()
{
@ pragma("PamDC_globalBuffer", "%n %d", n, place);
}
PamDC.setDefaultClock(n) = ()
{
@ pragma("PamDC_setDefaultClock", "%b %n", n);
}