Workaround for default typeclass function definitions
This commit is contained in:
@@ -904,7 +904,7 @@ instance CHERICap #(CapMem, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3));
|
||||
function setBoundsCombined = error("feature not implemented for this cap type");
|
||||
function nullWithAddr = error("feature not implemented for this cap type");
|
||||
function almightyCap = error("feature not implemented for this cap type");
|
||||
function nullCap = error("feature not implemented for this cap type");
|
||||
function nullCapFromDummy = error("feature not implemented for this cap type");
|
||||
function validAsType = error("feature not implemented for this cap type");
|
||||
function fromMem = error("feature not implemented for this cap type");
|
||||
function toMem = error("feature not implemented for this cap type");
|
||||
@@ -1030,7 +1030,7 @@ instance CHERICap #(CapReg, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3));
|
||||
|
||||
function almightyCap = defaultCapFat;
|
||||
|
||||
function nullCap = null_cap;
|
||||
function nullCapFromDummy (x) = null_cap;
|
||||
|
||||
function Bool validAsType (CapReg dummy, Bit#(CapAddressW) checkType);
|
||||
UInt#(CapAddressW) checkTypeUnsigned = unpack(checkType);
|
||||
@@ -1120,7 +1120,7 @@ instance CHERICap #(CapPipe, OTypeW, FlagsW, CapAddressW, CapW, TSub#(MW, 3));
|
||||
return CapPipe {capFat: res, tempFields: getTempFields(res)};
|
||||
endfunction
|
||||
|
||||
function nullCap;
|
||||
function nullCapFromDummy (x);
|
||||
CapReg res = nullCap;
|
||||
return CapPipe {capFat: res, tempFields: getTempFields(res)};
|
||||
endfunction
|
||||
|
||||
13
CHERICap.bsv
13
CHERICap.bsv
@@ -170,10 +170,13 @@ typeclass CHERICap#(type t, numeric type ot, numeric type flg, numeric type n, n
|
||||
// Returns a null cap with an address set to the argument
|
||||
function t nullWithAddr (Bit#(n) addr);
|
||||
|
||||
// Workaround to allow null cap to be derived in default implementations
|
||||
function t nullCapFromDummy(t dummy);
|
||||
|
||||
// Return the maximally permissive capability (initial register state)
|
||||
function t almightyCap;
|
||||
// Return the null capability
|
||||
function t nullCap;
|
||||
function t nullCap = nullCapFromDummy(?);
|
||||
|
||||
// Check if a type is valid
|
||||
function Bool validAsType (t dummy, Bit#(n) checkType);
|
||||
@@ -196,12 +199,12 @@ typeclass CHERICap#(type t, numeric type ot, numeric type flg, numeric type n, n
|
||||
|
||||
// TODO the following do not compile due to "not enough explicit type information"
|
||||
// Get representable alignment mask
|
||||
// function Bit#(n) getRepresentableAlignmentMask (t dummy, Bit#(n) length_request) =
|
||||
// setBoundsCombined(nullCap, length_request).mask;
|
||||
function Bit#(n) getRepresentableAlignmentMask (t dummy, Bit#(n) length_request) =
|
||||
setBoundsCombined(nullCapFromDummy(dummy), length_request).mask;
|
||||
|
||||
// Get representable length
|
||||
// function Bit#(n) getRepresentableLength (t dummy, Bit#(n) length_request) =
|
||||
// setBoundsCombined(nullCap, length_request).length;
|
||||
function Bit#(n) getRepresentableLength (t dummy, Bit#(n) length_request) =
|
||||
setBoundsCombined(nullCapFromDummy(dummy), length_request).length;
|
||||
|
||||
// Assert that the encoding is valid
|
||||
function Bool isDerivable (t cap);
|
||||
|
||||
Reference in New Issue
Block a user