function renderCanvas(scope) {
    if (layoutModeGet() || verilogModeGet()) { // Different Algorithm
        return;
    }
    var ctx = simulationArea.context;
    // Reset canvas
    simulationArea.clear();
    // Update Grid
    if (gridUpdate) {
        gridUpdateSet(false);
        dots();
    }
    canvasMessageData = {
        x: undefined,
        y: undefined,
        string: undefined,
    }; //  Globally set in draw fn ()
    // Render objects
    for (let i = 0; i < renderOrder.length; i++) {
        for (var j = 0; j < scope[renderOrder[i]].length; j++) { scope[renderOrder[i]][j].draw(); }
    }
    // Show any message
    if (canvasMessageData.string !== undefined) {
        canvasMessage(ctx, canvasMessageData.string, canvasMessageData.x, canvasMessageData.y);
    }
    // If multiple object selections are going on, show selected area
    if (objectSelection) {
        ctx.beginPath();
        ctx.lineWidth = 2;
        ctx.strokeStyle = 'black';
        ctx.fillStyle = 'rgba(0,0,0,0.1)';
        rect2(ctx, simulationArea.mouseDownX, simulationArea.mouseDownY, simulationArea.mouseX - simulationArea.mouseDownX, simulationArea.mouseY - simulationArea.mouseDownY, 0, 0, 'RIGHT');
        ctx.stroke();
        ctx.fill();
    }
    if (simulationArea.hover !== undefined) {
        simulationArea.canvas.style.cursor = 'pointer';
    } else if (simulationArea.mouseDown) {
        simulationArea.canvas.style.cursor = 'grabbing';
    } else {
        simulationArea.canvas.style.cursor = 'default';
    }
}
Function to render Canvas according th renderupdate order
@param {Scope} scope - The circuit whose canvas we want to render
@category engine