浏览代码

avoid causing the same round of check to be run multiple times when detecting IOs

Fabio Battaglia 5 年之前
父节点
当前提交
43373f3c07
共有 1 个文件被更改,包括 15 次插入12 次删除
  1. 15 12
      src/main/java/info/hkzlab/dupal/analyzer/board/boardio/DuPALAnalyzer.java

+ 15 - 12
src/main/java/info/hkzlab/dupal/analyzer/board/boardio/DuPALAnalyzer.java

@@ -36,33 +36,36 @@ public class DuPALAnalyzer {
     public int detectIOTypeMask(final DuPALCmdInterface dpci) throws DuPALBoardException {
     public int detectIOTypeMask(final DuPALCmdInterface dpci) throws DuPALBoardException {
         int ioAsOutMask = 0;
         int ioAsOutMask = 0;
         int maxINVal = 1 << (dpci.palSpecs.getPinCount_IN() + dpci.palSpecs.getPinCount_IO());
         int maxINVal = 1 << (dpci.palSpecs.getPinCount_IN() + dpci.palSpecs.getPinCount_IO());
-        int maxINDivider = 1;
 
 
         logger.info("Starting IO type detection... This could take a while.");
         logger.info("Starting IO type detection... This could take a while.");
         logger.info("Highest address for input pins: " + String.format("%06X", maxINVal-1));
         logger.info("Highest address for input pins: " + String.format("%06X", maxINVal-1));
 
 
-        int writeAddr, o_write_mask;
-        for(int idx = 0; idx < (maxINVal / maxINDivider); idx++) {
-            for(int sub_idx = 0; sub_idx < (maxINVal / maxINDivider); sub_idx++) {
+        for(int idx = 0; idx < maxINVal; idx++) {
+
+            int o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
+            int writeAddr = BitUtils.scatterBitField(idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_W());
+            
+            if((writeAddr & o_write_mask) != 0) continue;
+
+            for(int sub_idx = 0; sub_idx < maxINVal; sub_idx++) {
                 if(ioAsOutMask == dpci.palSpecs.getMask_IO_R()) break; // All the IOs we already found to be outputs, no need to continue
                 if(ioAsOutMask == dpci.palSpecs.getMask_IO_R()) break; // All the IOs we already found to be outputs, no need to continue
 
 
-                o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
-                writeAddr = BitUtils.scatterBitField(sub_idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField(sub_idx >> dpci.palSpecs.getPinCount_IN(), dpci.palSpecs.getMask_IO_W() & ~o_write_mask);
+                int sub_o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
+                int sub_writeAddr = BitUtils.scatterBitField(sub_idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField(sub_idx >> dpci.palSpecs.getPinCount_IN(), dpci.palSpecs.getMask_IO_W());
+                
+                if((sub_writeAddr & sub_o_write_mask) != 0) continue; // Skip this run, as we're tryng to set something we found to be an output
 
 
-                dpci.write(writeAddr);
+                dpci.write(sub_writeAddr);
                 int pinstat = dpci.read();
                 int pinstat = dpci.read();
 
 
                 ioAsOutMask |= (pinstat ^ BitUtils.scatterBitField((sub_idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_R())) & dpci.palSpecs.getMask_IO_R();
                 ioAsOutMask |= (pinstat ^ BitUtils.scatterBitField((sub_idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_R())) & dpci.palSpecs.getMask_IO_R();
                 
                 
-                maxINDivider = (1<<BitUtils.countBits(ioAsOutMask));
-                logger.info(String.format("idx: C(%06X) -> S(%06X) | M[%06X]", sub_idx, writeAddr, ioAsOutMask));
+                logger.info(String.format("idx: C(%06X) -> S(%06X) | M[%06X]", sub_idx, sub_writeAddr, ioAsOutMask));
             }
             }
 
 
             if(dpci.palSpecs.getPinCount_RO() == 0) break; // No need to try multiple registered states
             if(dpci.palSpecs.getPinCount_RO() == 0) break; // No need to try multiple registered states
 
 
-            o_write_mask = BitUtils.scatterBitField(BitUtils.consolidateBitField(ioAsOutMask, (dpci.palSpecs.getMask_IO_R())), dpci.palSpecs.getMask_IO_W());
-            writeAddr = BitUtils.scatterBitField(idx, dpci.palSpecs.getMask_IN()) | BitUtils.scatterBitField((idx >> dpci.palSpecs.getPinCount_IN()), dpci.palSpecs.getMask_IO_W() & ~o_write_mask);
-
+            logger.info("Pulsing clock with address " + String.format("%06X", writeAddr));
             dpci.writeAndPulseClock(writeAddr);
             dpci.writeAndPulseClock(writeAddr);
         }
         }