mirror of
https://github.com/annoyatron255/yosys4gal.git
synced 2024-12-22 10:42:24 +00:00
add chip argument, untested 22v10
This commit is contained in:
parent
1989470bc4
commit
abdaf710e6
|
@ -33,10 +33,7 @@ pub enum MappingError {
|
|||
// attempt to map graph into blueprint
|
||||
|
||||
/// Acquire the SOP associated with the OLMC. If it's
|
||||
fn get_sop_for_olmc(
|
||||
graph: &Graph,
|
||||
olmc_idx: &NodeIdx,
|
||||
) -> Result<GalSop, MappingError> {
|
||||
fn get_sop_for_olmc(graph: &Graph, olmc_idx: &NodeIdx) -> Result<GalSop, MappingError> {
|
||||
let input = graph.get_node_port_conns(olmc_idx, "A");
|
||||
debug!("Found connections into OLMC Input: {:?}", input);
|
||||
debug!("OLMC {:?}", graph.get_node(olmc_idx));
|
||||
|
@ -56,9 +53,7 @@ fn get_sop_for_olmc(
|
|||
// find the row that contains this olmc.
|
||||
// we know this exists because mapping has already finished.
|
||||
let newsop = GalSop {
|
||||
connections: HashMap::from([
|
||||
("A".to_string(), vec![i.net.clone()]),
|
||||
]),
|
||||
connections: HashMap::from([("A".to_string(), vec![i.net.clone()])]),
|
||||
parameters: GalSopParameters {
|
||||
depth: 1,
|
||||
width: 1,
|
||||
|
@ -66,8 +61,7 @@ fn get_sop_for_olmc(
|
|||
},
|
||||
};
|
||||
Some(newsop)
|
||||
|
||||
},
|
||||
}
|
||||
_ => None,
|
||||
}
|
||||
})
|
||||
|
@ -117,10 +111,21 @@ fn map_remaining_olmc(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
fn chip_to_olmc_offset(chip: &Chip) -> usize {
|
||||
match chip {
|
||||
Chip::GAL16V8 => 12,
|
||||
Chip::GAL22V10 => 14,
|
||||
_ => panic!("Invalid chip!"),
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
fn find_hwpin_for_net(
|
||||
graph: &Graph,
|
||||
pcf: &PcfFile,
|
||||
olmcmap: &Vec<Option<NodeIdx>>,
|
||||
olmcmap: &[Option<NodeIdx>],
|
||||
chip: &Chip,
|
||||
net: &Net,
|
||||
) -> Result<u32, MappingError> {
|
||||
// this does a double lookup. first it finds the Input on the net,
|
||||
|
@ -169,9 +174,12 @@ fn find_hwpin_for_net(
|
|||
.iter()
|
||||
.position(|node| node == inputs[0])
|
||||
.unwrap();
|
||||
let olmc_row = olmcmap.iter().position(|r| r == &Some(NodeIdx(olmc_idx))).unwrap();
|
||||
let olmc_row = olmcmap
|
||||
.iter()
|
||||
.position(|r| r == &Some(NodeIdx(olmc_idx)))
|
||||
.unwrap();
|
||||
// we have the row.
|
||||
let pin = olmc_row + 12; // TODO: fix!
|
||||
let pin = olmc_row + chip_to_olmc_offset(chip); // TODO: fix!
|
||||
debug!("OLMC discovered on {pin}");
|
||||
Ok(pin as u32)
|
||||
}
|
||||
|
@ -182,7 +190,8 @@ fn find_hwpin_for_net(
|
|||
fn make_term_from_sop(
|
||||
graph: &Graph,
|
||||
pcf: &PcfFile,
|
||||
olmcmap: &Vec<Option<NodeIdx>>,
|
||||
olmcmap: &[Option<NodeIdx>],
|
||||
chip: &Chip,
|
||||
sop: GalSop,
|
||||
) -> Term {
|
||||
let table = sop.parameters.table.as_bytes();
|
||||
|
@ -207,7 +216,7 @@ fn make_term_from_sop(
|
|||
let net_for_pin = input_nets.get(idx).unwrap();
|
||||
// now use the helper to find the true hardware pin
|
||||
let hwpin: usize =
|
||||
find_hwpin_for_net(graph, pcf, olmcmap, net_for_pin).unwrap() as usize;
|
||||
find_hwpin_for_net(graph, pcf, olmcmap, &chip, net_for_pin).unwrap() as usize;
|
||||
// we now have our hardware pin number!
|
||||
match *product {
|
||||
"01" => Some(Pin {
|
||||
|
@ -353,7 +362,7 @@ pub fn graph_convert(graph: &Graph, pcf: PcfFile, chip: Chip) -> anyhow::Result<
|
|||
debug!("Mapping node {node} at row {idx}");
|
||||
let sop = get_sop_for_olmc(graph, node)?;
|
||||
debug!("Got SOP {:?} attached to node", sop);
|
||||
let term = make_term_from_sop(graph, &pcf, &olmcmap, sop);
|
||||
let term = make_term_from_sop(graph, &pcf, &olmcmap, &chip, sop);
|
||||
debug!("Got term {:?}", term);
|
||||
let gal_olmc_node = graph.get_node(node).unwrap();
|
||||
if let Node::Olmc(o) = gal_olmc_node {
|
||||
|
|
|
@ -2,7 +2,7 @@ pub mod pcf;
|
|||
pub mod yosys_parser;
|
||||
mod fitter;
|
||||
|
||||
use clap::{Parser, Subcommand, Args};
|
||||
use clap::{Parser, Subcommand, ValueEnum, Args};
|
||||
use galette::gal_builder::build;
|
||||
use galette::writer::{make_jedec, Config};
|
||||
use crate::pcf::parse_pcf;
|
||||
|
@ -35,6 +35,21 @@ struct ValidateArgs {
|
|||
file: PathBuf,
|
||||
}
|
||||
|
||||
#[derive(ValueEnum, Debug, Clone)]
|
||||
enum ChipType {
|
||||
GAL16V8,
|
||||
GAL22V10
|
||||
}
|
||||
|
||||
impl ChipType {
|
||||
fn to_galette(&self) -> Chip {
|
||||
match self {
|
||||
Self::GAL16V8 => Chip::GAL16V8,
|
||||
Self::GAL22V10 => Chip::GAL22V10,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#[derive(Args)]
|
||||
struct SynthArgs {
|
||||
|
@ -42,6 +57,9 @@ struct SynthArgs {
|
|||
netlist: PathBuf,
|
||||
#[arg(required = true, value_hint = clap::ValueHint::DirPath)]
|
||||
constraints: PathBuf,
|
||||
|
||||
#[arg(value_enum, long, default_value_t=ChipType::GAL16V8)]
|
||||
chip: ChipType
|
||||
}
|
||||
|
||||
|
||||
|
@ -83,7 +101,7 @@ fn synth(s: SynthArgs) -> Result<()> {
|
|||
let pcf_string = std::str::from_utf8(pcf_file)?;
|
||||
let pcf = parse_pcf(pcf_string);
|
||||
|
||||
let res = graph_convert(&g, pcf, Chip::GAL16V8)?;
|
||||
let res = graph_convert(&g, pcf, s.chip.to_galette())?;
|
||||
|
||||
let mut gal = build(&res)?;
|
||||
|
||||
|
|
Loading…
Reference in a new issue