finish build bb

This commit is contained in:
yyc12345 2023-02-22 10:23:05 +08:00
parent 9edbb79542
commit 979183e9fc
3 changed files with 125 additions and 3 deletions

View File

@ -1,5 +1,12 @@
import sqlite3
import DecoratorData
import sqlite3, collections
import DecoratorData, DecoratorConst
class IntermediateTreeNode(object):
def __init__(self):
self.m_FirstVisit: bool = True
self.m_LoactedLayer: int = DecoratorData.TreeLayout.NO_REFERENCE_LAYER
self.m_LocatedPos: int = DecoratorData.TreeLayout.NO_START_POS_OF_REF_LAYER
self.m_Collection: collections.deque[int] = collections.deque()
class BlocksFactory(object):
def __init__(self, db: sqlite3.Connection, graph: int):
@ -20,6 +27,12 @@ class BlocksFactory(object):
# fill data first
self.__FillDataFromDb()
# proc each data
self.__ProcActiveBB()
self.__ProcPassiveBB()
self.__ProcPassiveOper()
def __GetOneFromSet(self, vals: set[int]) -> int:
return next(iter(vals))
@ -36,6 +49,93 @@ class BlocksFactory(object):
self.m_OperDict[payload.m_CKID] = DecoratorData.OperTreeNode(payload)
self.__AllOper.add(payload.m_CKID)
def __BuildBB(self, tree: DecoratorData.TreeLayout, start_io: tuple[int]):
def __FindBBBottomOperRoot(self, start_pOut: int) -> tuple[int]:
pass
def __BuildOper(self, tree: DecoratorData.TreeLayout, start_oper: int):
pass
def __BuildBB(self, tree: DecoratorData.TreeLayout, start_bb: int):
# prepare stack and start condition
stack: collections.deque[IntermediateTreeNode] = collections.deque()
# check whether this BB has been processed
if start_bb not in self.__AllBB:
return
self.__AllBB.remove(start_bb)
# create new layer and insert it
tree.NewLayer(DecoratorData.TreeLayout.NO_REFERENCE_LAYER, DecoratorData.TreeLayout.NO_START_POS_OF_REF_LAYER)
tree.NewItem(self.m_BBDict[start_bb])
# prepare stack data
start_bb_data: IntermediateTreeNode = IntermediateTreeNode()
start_bb_data.m_LoactedLayer = tree.GetCurrentLayerIndex()
start_bb_data.m_LocatedPos = tree.GetCurrentItemIndex()
self.__Cursor.execute("SELECT [output_obj] FROM [script_bLink] WHERE ([input_obj] == ? AND [input_type] == ? AND [belong_to] = ?) ORDER BY [input_index] ASC;",
(start_bb, DecoratorConst.Database_bLink_InputOutputType.OUTPUT, self.m_GraphCKID, )
)
for (output_obj, ) in self.__Cursor.fetchall():
start_bb_data.m_Collection.append(output_obj)
stack.append(start_bb_data)
# start analyze
while len(stack) != 0:
# pick stack and decide whether pop this
stack_entry: IntermediateTreeNode = stack[-1]
if len(stack_entry.m_Collection) == 0:
stack.pop()
continue
# pick a new BB from collection.
# check whether it need process
bb_id: int = stack_entry.m_Collection[-1]
if bb_id not in self.__AllBB:
stack_entry.m_Collection.pop()
continue
self.__AllBB.remove(bb_id)
# get corresponding tree node
tree_node = self.m_BBDict[bb_id]
# start proc BB
# create new stack entry
bb_data: IntermediateTreeNode = IntermediateTreeNode()
# push tree node into tree layout and get corresponding index.
# create new layer according to whether first visit
if stack_entry.m_FirstVisit:
tree.NewItem(tree_node)
bb_data.m_LoactedLayer = stack_entry.m_LoactedLayer
bb_data.m_LocatedPos = stack_entry.m_LocatedPos + 1
# reset first visit
stack_entry.m_FirstVisit = False
else:
tree.NewLayer(stack_entry.m_LoactedLayer, stack_entry.m_LocatedPos)
tree.NewItem(tree_node)
bb_data.m_LoactedLayer = tree.GetCurrentLayerIndex()
bb_data.m_LocatedPos = tree.GetCurrentItemIndex()
# query and fill stack entry data
self.__Cursor.execute("SELECT [output_obj] FROM [script_bLink] WHERE ([input_obj] == ? AND [input_type] == ? AND [belong_to] = ?) ORDER BY [input_index] ASC;",
(bb_id, DecoratorConst.Database_bLink_InputOutputType.OUTPUT, self.m_GraphCKID, )
)
for (output_obj, ) in self.__Cursor.fetchall():
bb_data.m_Collection.append(output_obj)
stack.append(bb_data)
# todo: executing oper finder for current bb
def __ProcActiveBB(self):
self.__Cursor.execute("SELECT [output_obj] FROM [script_bLink] WHERE ([input_obj] == ? AND [input_type] == ? AND [belong_to] = ?) ORDER BY [input_index] ASC;",
(self.m_GraphCKID, DecoratorConst.Database_bLink_InputOutputType.INPUT, self.m_GraphCKID, )
)
for (output_obj, ) in self.__Cursor.fetchall():
self.__BuildBB(self.m_ActiveBBLayer, output_obj)
def __ProcPassiveBB(self):
while len(self.__AllBB) != 0:
self.__BuildBB(self.m_PassiveBBLayer, self.__GetOneFromSet(self.__AllBB))
def __ProcPassiveOper(self):
pass

View File

@ -0,0 +1,11 @@
class Database_bLink_InputOutputType(object):
INPUT = 0
OUTPUT = 1
class Database_pLink_InputOutputType(object):
PIN = 0
POUT = 1
PLOCAL = 2
PTARGET = 3
PATTR = 4

View File

@ -96,11 +96,22 @@ class TreeLayoutLayer(typing.Generic[TNode]):
class TreeLayout(typing.Generic[TNode]):
NO_REFERENCE_LAYER: int = -1
NO_START_POS_OF_REF_LAYER: int = -1
def __init__(self):
self.m_Layers: collections.deque[TreeLayoutLayer[TNode]] = collections.deque()
self.__CurrentLayer: TreeLayoutLayer[TNode] = None
def GetCurrentLayerIndex(self) -> int:
if self.__CurrentLayer is None: raise Exception("No layer!")
return len(self.m_Layers) - 1
def GetCurrentItemIndex(self) -> int:
if self.__CurrentLayer is None: raise Exception("No layer!")
result = len(self.__CurrentLayer)
if result == 0: raise Exception("No item!")
return result - 1
def NewLayer(self, ref_layer: int, start_pos_of_ref_layer: int):
self.__CurrentLayer = TreeLayoutLayer(ref_layer, start_pos_of_ref_layer)
self.m_Layers.append(self.__CurrentLayer)