Skip to content

Commit

Permalink
xc2bit: Initial error handling refactor
Browse files Browse the repository at this point in the history
Make error types be enums rather than strings
ArcaneNibble committed Jun 22, 2017
1 parent b08ddd9 commit 8f6b576
Showing 6 changed files with 91 additions and 109 deletions.
58 changes: 29 additions & 29 deletions src/xc2bit/src/bitstream.rs
Original file line number Diff line number Diff line change
@@ -86,10 +86,10 @@ impl XC2Bitstream {

/// Construct a new blank bitstream of the given part
pub fn blank_bitstream(device: XC2Device, speed_grade: XC2Speed, package: XC2Package)
-> Result<XC2Bitstream, &'static str> {
-> Result<XC2Bitstream, XC2BitError> {

if !is_valid_part_combination(device, speed_grade, package) {
return Err("requested device/speed/package is not a legal combination")
return Err(XC2BitError::BadDeviceName(format!("{}-{}-{}", device, speed_grade, package)));
}

match device {
@@ -1158,7 +1158,7 @@ impl XC2BitstreamBits {

/// Common logic for reading bitstreams on "small" devices
pub fn read_bitstream_logical_common_small(fuses: &[bool], device: XC2Device,
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCSmallIOB]) -> Result<(), &'static str> {
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCSmallIOB]) -> Result<(), XC2BitError> {

for i in 0..fb.len() {
let base_fuse = fb_fuse_idx(device, i as u32);
@@ -1183,7 +1183,7 @@ pub fn read_bitstream_logical_common_small(fuses: &[bool], device: XC2Device,

/// Common logic for reading bitstreams on "large" devices
pub fn read_bitstream_logical_common_large(fuses: &[bool], device: XC2Device,
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCLargeIOB]) -> Result<(), &'static str> {
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCLargeIOB]) -> Result<(), XC2BitError> {

for i in 0..fb.len() {
let base_fuse = fb_fuse_idx(device, i as u32);
@@ -1212,7 +1212,7 @@ pub fn read_bitstream_logical_common_large(fuses: &[bool], device: XC2Device,
Ok(())
}
/// Internal function for parsing an XC2C32 bitstream
pub fn read_32_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_32_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 2];
let mut iobs = [XC2MCSmallIOB::default(); 32];

@@ -1233,7 +1233,7 @@ pub fn read_32_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'s
}

/// Internal function for parsing an XC2C32A bitstream
pub fn read_32a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_32a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 2];
let mut iobs = [XC2MCSmallIOB::default(); 32];

@@ -1262,7 +1262,7 @@ pub fn read_32a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'
}

/// Internal function for parsing an XC2C64 bitstream
pub fn read_64_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_64_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 4];
let mut iobs = [XC2MCSmallIOB::default(); 64];

@@ -1280,7 +1280,7 @@ pub fn read_64_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'s
}

/// Internal function for parsing an XC2C64A bitstream
pub fn read_64a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_64a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 4];
let mut iobs = [XC2MCSmallIOB::default(); 64];

@@ -1306,7 +1306,7 @@ pub fn read_64a_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'
}

/// Internal function for parsing an XC2C128 bitstream
pub fn read_128_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_128_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 8];
let mut iobs = [XC2MCLargeIOB::default(); 100];

@@ -1333,7 +1333,7 @@ pub fn read_128_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'
}

/// Internal function for parsing an XC2C256 bitstream
pub fn read_256_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_256_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 16];
let mut iobs = [XC2MCLargeIOB::default(); 184];

@@ -1360,7 +1360,7 @@ pub fn read_256_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'
}

/// Internal function for parsing an XC2C384 bitstream
pub fn read_384_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_384_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 24];
let mut iobs = [XC2MCLargeIOB::default(); 240];

@@ -1391,7 +1391,7 @@ pub fn read_384_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'
}

/// Internal function for parsing an XC2C512 bitstream
pub fn read_512_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_512_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 32];
let mut iobs = [XC2MCLargeIOB::default(); 270];

@@ -1423,7 +1423,7 @@ pub fn read_512_bitstream_logical(fuses: &[bool]) -> Result<XC2BitstreamBits, &'

/// Common logic for reading bitstreams on "small" devices
pub fn read_bitstream_physical_common_small(fuse_array: &FuseArray, device: XC2Device,
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCSmallIOB]) -> Result<(), &'static str> {
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCSmallIOB]) -> Result<(), XC2BitError> {

for i in 0..fb.len() {
fb[i] = XC2BitstreamFB::from_crbit(device, i as u32, fuse_array)?;
@@ -1438,7 +1438,7 @@ pub fn read_bitstream_physical_common_small(fuse_array: &FuseArray, device: XC2D

/// Common logic for reading bitstreams on "large" devices
pub fn read_bitstream_physical_common_large(fuse_array: &FuseArray, device: XC2Device,
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCLargeIOB]) -> Result<(), &'static str> {
fb: &mut [XC2BitstreamFB], iobs: &mut [XC2MCLargeIOB]) -> Result<(), XC2BitError> {

for i in 0..fb.len() {
fb[i] = XC2BitstreamFB::from_crbit(device, i as u32, fuse_array)?;
@@ -1452,7 +1452,7 @@ pub fn read_bitstream_physical_common_large(fuse_array: &FuseArray, device: XC2D
}

/// Internal function for parsing an XC2C32 bitstream
pub fn read_32_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_32_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 2];
let mut iobs = [XC2MCSmallIOB::default(); 32];

@@ -1473,7 +1473,7 @@ pub fn read_32_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstream
}

/// Internal function for parsing an XC2C32A bitstream
pub fn read_32a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_32a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 2];
let mut iobs = [XC2MCSmallIOB::default(); 32];

@@ -1502,7 +1502,7 @@ pub fn read_32a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Internal function for parsing an XC2C64 bitstream
pub fn read_64_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_64_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 4];
let mut iobs = [XC2MCSmallIOB::default(); 64];

@@ -1520,7 +1520,7 @@ pub fn read_64_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstream
}

/// Internal function for parsing an XC2C64A bitstream
pub fn read_64a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_64a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 4];
let mut iobs = [XC2MCSmallIOB::default(); 64];

@@ -1546,7 +1546,7 @@ pub fn read_64a_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Internal function for parsing an XC2C128 bitstream
pub fn read_128_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_128_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 8];
let mut iobs = [XC2MCLargeIOB::default(); 100];

@@ -1573,7 +1573,7 @@ pub fn read_128_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Internal function for parsing an XC2C256 bitstream
pub fn read_256_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_256_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 16];
let mut iobs = [XC2MCLargeIOB::default(); 184];

@@ -1600,7 +1600,7 @@ pub fn read_256_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Internal function for parsing an XC2C384 bitstream
pub fn read_384_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_384_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 24];
let mut iobs = [XC2MCLargeIOB::default(); 240];

@@ -1631,7 +1631,7 @@ pub fn read_384_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Internal function for parsing an XC2C512 bitstream
pub fn read_512_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, &'static str> {
pub fn read_512_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2BitstreamBits, XC2BitError> {
let mut fb = [XC2BitstreamFB::default(); 32];
let mut iobs = [XC2MCLargeIOB::default(); 270];

@@ -1662,16 +1662,16 @@ pub fn read_512_bitstream_physical(fuse_array: &FuseArray) -> Result<XC2Bitstrea
}

/// Processes a fuse array into a bitstream object
pub fn process_jed(fuses: &[bool], device: &str) -> Result<XC2Bitstream, &'static str> {
pub fn process_jed(fuses: &[bool], device: &str) -> Result<XC2Bitstream, XC2BitError> {
let device_combination = parse_part_name_string(device);
if device_combination.is_none() {
return Err("malformed device name");
return Err(XC2BitError::BadDeviceName(device.to_owned()));
}

let (part, spd, pkg) = device_combination.unwrap();

if fuses.len() != total_logical_fuse_count(part) {
return Err("wrong number of fuses");
return Err(XC2BitError::WrongFuseCount);
}

match part {
@@ -1743,21 +1743,21 @@ pub fn process_jed(fuses: &[bool], device: &str) -> Result<XC2Bitstream, &'stati
}

/// Processes a fuse array (in physical addressing) into a bitstream object
pub fn process_crbit(fuse_array: &FuseArray) -> Result<XC2Bitstream, &'static str> {
pub fn process_crbit(fuse_array: &FuseArray) -> Result<XC2Bitstream, XC2BitError> {
// FIXME: Can we guess the device type from the dimensions?
if fuse_array.dev_name_str.is_none() {
return Err("unspecified device name");
return Err(XC2BitError::BadDeviceName(String::from("")));
}

let device_combination = parse_part_name_string(fuse_array.dev_name_str.as_ref().unwrap());
if device_combination.is_none() {
return Err("malformed device name");
return Err(XC2BitError::BadDeviceName(fuse_array.dev_name_str.as_ref().unwrap().to_owned()));
}

let (part, spd, pkg) = device_combination.unwrap();

if fuse_array.dim() != fuse_array_dims(part) {
return Err("wrong number of fuses");
return Err(XC2BitError::WrongFuseCount);
}


4 changes: 2 additions & 2 deletions src/xc2bit/src/fb.rs
Original file line number Diff line number Diff line change
@@ -359,7 +359,7 @@ impl XC2BitstreamFB {
/// Reads the crbit representation of the settings for this FB from the given `fuse_array`.
/// `device` must be the device type this FB was extracted from.
/// `fb` must be the index of this function block.
pub fn from_crbit(device: XC2Device, fb: u32, fuse_array: &FuseArray) -> Result<XC2BitstreamFB, &'static str> {
pub fn from_crbit(device: XC2Device, fb: u32, fuse_array: &FuseArray) -> Result<XC2BitstreamFB, XC2BitError> {
// ZIA
let mut zia_bits = [XC2ZIARowPiece::default(); INPUTS_PER_ANDTERM];
let (x, y) = zia_block_loc(device, fb);
@@ -619,7 +619,7 @@ impl XC2BitstreamFB {

/// Internal function that reads a function block
pub fn read_fb_logical(device: XC2Device, fuses: &[bool], fb: u32, fuse_base: usize)
-> Result<XC2BitstreamFB, &'static str> {
-> Result<XC2BitstreamFB, XC2BitError> {

let zia_row_width = zia_get_row_width(device);
let size_of_zia = zia_row_width * INPUTS_PER_ANDTERM;
12 changes: 6 additions & 6 deletions src/xc2bit/src/iob.rs
Original file line number Diff line number Diff line change
@@ -95,7 +95,7 @@ impl XC2IOBOBufMode {
}

/// decodes the Oe bits
pub fn decode(oe: (bool, bool, bool, bool)) -> Result<Self, &'static str> {
pub fn decode(oe: (bool, bool, bool, bool)) -> Result<Self, XC2BitError> {
Ok(match oe {
(false, false, false, false) => XC2IOBOBufMode::PushPull,
(false, false, false, true) => XC2IOBOBufMode::OpenDrain,
@@ -107,7 +107,7 @@ impl XC2IOBOBufMode {
(true, true, false, false) => XC2IOBOBufMode::TriStateGTS0,
(true, true, true, false) => XC2IOBOBufMode::CGND,
(true, true, true, true) => XC2IOBOBufMode::Disabled,
_ => return Err("unknown Oe mode used"),
_ => return Err(XC2BitError::UnsupportedOeConfiguration(oe)),
})
}
}
@@ -255,7 +255,7 @@ impl XC2MCSmallIOB {
/// Read the crbit representation of the settings for this IO pin from the given `fuse_array`.
/// `device` must be the device type this FB was extracted from.
/// `iob` must be the index of this IO pin.
pub fn from_crbit(device: XC2Device, iob: u32, fuse_array: &FuseArray) -> Result<XC2MCSmallIOB, &'static str> {
pub fn from_crbit(device: XC2Device, iob: u32, fuse_array: &FuseArray) -> Result<XC2MCSmallIOB, XC2BitError> {
let (fb, mc) = iob_num_to_fb_ff_num(device, iob).unwrap();
let (x, y, mirror) = mc_block_loc(device, fb);
// direction
@@ -536,7 +536,7 @@ impl XC2MCLargeIOB {
/// Read the crbit representation of the settings for this IO pin from the given `fuse_array`.
/// `device` must be the device type this FB was extracted from.
/// `iob` must be the index of this IO pin.
pub fn from_crbit(device: XC2Device, iob: u32, fuse_array: &FuseArray) -> Result<XC2MCLargeIOB, &'static str> {
pub fn from_crbit(device: XC2Device, iob: u32, fuse_array: &FuseArray) -> Result<XC2MCLargeIOB, XC2BitError> {
let (fb, mc) = iob_num_to_fb_ff_num(device, iob).unwrap();
let (x, y, mirror) = mc_block_loc(device, fb);
// direction
@@ -1215,7 +1215,7 @@ pub fn fb_ff_num_to_iob_num(device: XC2Device, fb: u32, ff: u32) -> Option<u32>
}

/// Internal function that reads only the IO-related bits from the macrocell configuration
pub fn read_small_iob_logical(fuses: &[bool], fuse_idx: usize) -> Result<XC2MCSmallIOB, &'static str> {
pub fn read_small_iob_logical(fuses: &[bool], fuse_idx: usize) -> Result<XC2MCSmallIOB, XC2BitError> {
let inz = (fuses[fuse_idx + 11],
fuses[fuse_idx + 12]);
let input_to_zia = XC2IOBZIAMode::decode(inz);
@@ -1243,7 +1243,7 @@ pub fn read_small_iob_logical(fuses: &[bool], fuse_idx: usize) -> Result<XC2MCSm
}

/// Internal function that reads only the IO-related bits from the macrocell configuration
pub fn read_large_iob_logical(fuses: &[bool], fuse_idx: usize) -> Result<XC2MCLargeIOB, &'static str> {
pub fn read_large_iob_logical(fuses: &[bool], fuse_idx: usize) -> Result<XC2MCLargeIOB, XC2BitError> {
let dg = fuses[fuse_idx + 5];

let inmod = (fuses[fuse_idx + 8],
Loading

0 comments on commit 8f6b576

Please sign in to comment.