Check if a state is valid with respect to given features.
As explained in stat, that fixtype models all possible machine states for all possible features. Here we define restrictions based on features.
For now, the only features we model are
whether the base is RV32I or RV64I.
This dictates the size
Based on
The size of the memory is
Function:
(defun stat-validp (stat feat) (declare (xargs :guard (and (statp stat) (featp feat)))) (let ((__function__ 'stat-validp)) (declare (ignorable __function__)) (b* (((stat stat) stat) (xlen (feat->xlen feat)) (xnum (feat->xnum feat))) (and (unsigned-byte-listp xlen stat.xregs) (equal (len stat.xregs) xnum) (unsigned-byte-p xlen stat.pc) (equal (len stat.memory) (expt 2 xlen))))))
Theorem:
(defthm booleanp-of-stat-validp (b* ((yes/no (stat-validp stat feat))) (booleanp yes/no)) :rule-classes :rewrite)
Theorem:
(defthm unsigned-byte-listp-of-stat->xregs (implies (stat-validp stat feat) (unsigned-byte-listp (feat->xlen feat) (stat->xregs stat))))
Theorem:
(defthm true-listp-of-stat->xregs (implies (stat-validp stat feat) (true-listp (stat->xregs stat))) :rule-classes :type-prescription)
Theorem:
(defthm ubyte32-listp-of-stat->xregs (implies (and (stat-validp stat feat) (feat-bits-case (feat->bits feat) :|32|)) (ubyte32-listp (stat->xregs stat))))
Theorem:
(defthm ubyte64-listp-of-stat->xregs (implies (and (stat-validp stat feat) (feat-bits-case (feat->bits feat) :|64|)) (ubyte64-listp (stat->xregs stat))))
Theorem:
(defthm len-of-stat->xregs (implies (stat-validp stat feat) (equal (len (stat->xregs stat)) (feat->xnum feat))))
Theorem:
(defthm unsigned-byte-p-of-stat->pc (implies (stat-validp stat feat) (unsigned-byte-p (feat->xlen feat) (stat->pc stat))))
Theorem:
(defthm ubyte32p-of-stat->pc (implies (and (stat-validp stat feat) (feat-bits-case (feat->bits feat) :|32|)) (ubyte32p (stat->pc stat))))
Theorem:
(defthm ubyte64p-of-stat->pc (implies (and (stat-validp stat feat) (feat-bits-case (feat->bits feat) :|64|)) (ubyte64p (stat->pc stat))))
Theorem:
(defthm len-of-stat->memory (implies (stat-validp stat feat) (equal (len (stat->memory stat)) (expt 2 (feat->xlen feat)))))
Theorem:
(defthm stat-validp-of-stat-fix-stat (equal (stat-validp (stat-fix stat) feat) (stat-validp stat feat)))
Theorem:
(defthm stat-validp-stat-equiv-congruence-on-stat (implies (stat-equiv stat stat-equiv) (equal (stat-validp stat feat) (stat-validp stat-equiv feat))) :rule-classes :congruence)
Theorem:
(defthm stat-validp-of-feat-fix-feat (equal (stat-validp stat (feat-fix feat)) (stat-validp stat feat)))
Theorem:
(defthm stat-validp-feat-equiv-congruence-on-feat (implies (feat-equiv feat feat-equiv) (equal (stat-validp stat feat) (stat-validp stat feat-equiv))) :rule-classes :congruence)